From 3be9005f95ebc14639a7e281703dfa9d9b4a7afc Mon Sep 17 00:00:00 2001
From: ageerle <ageerle@163.com>
Date: 星期三, 09 四月 2025 17:41:29 +0800
Subject: [PATCH] feat: 调整知识库模块

---
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOperLogMapper.java                  |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeInfoServiceImpl.java        |  120 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserRole.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDictTypeMapper.java                 |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java                     |  292 +++
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java                |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/AvatarVo.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysPermissionService.java            |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/pom.xml                                                                   |   31 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatVoucherVo.java                           |    3 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUser.java                           |  133 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/MenuTreeSelectVo.java               |    0 
 ruoyi-modules-api/pom.xml                                                                                       |   35 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatVisitorUsageService.java                  |    4 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/LoginTenantVo.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java               |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysConfigVo.java                    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserImportVo.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDictTypeService.java              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOssConfigMapper.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/AudioOkHttpUtil.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysTenantMapper.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysSensitiveServiceImpl.java     |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java                   |   23 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatAppStoreMapper.java                |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatUsageToken.java                             |   51 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverMapper.java                       |   14 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysMenuVo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPostMapper.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysTenantPackageMapper.java            |    0 
 ruoyi-modules/ruoyi-chat/pom.xml                                                                                |   16 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CsvFileLoader.java                   |   18 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserMapper.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WddPptApi.java                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleMapper.java                     |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeFragment.java                     |   61 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/AesUtils.java                            |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java                       |   61 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleDeptMapper.xml                              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDeptBo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOperLog.java                        |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysNoticeStateMapper.java              |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeFragmentBo.java                |   66 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysPermissionServiceImpl.java    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOperLogVo.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDeptService.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeStateVo.java               |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeInfo.java                         |   96 +
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/GithubLoader.java                    |   18 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleDeptMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysMenuBo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysLogininforMapper.java               |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatUsageTokenVo.java                        |   61 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/UserInfoVo.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysRoleServiceImpl.java          |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/CoverPromptAudioMapper.xml                         |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysNotice.java                         |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOssMapper.xml                                   |    0 
 pom.xml                                                                                                         |   24 
 ruoyi-modules/pom.xml                                                                                           |    1 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java                      |  107 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysNoticeMapper.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysMenu.java                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/RouterVo.java                       |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitBlendDTO.java                            |   21 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDictTypeVo.java                  |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatUsageTokenBo.java                        |   54 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysNoticeStateService.java           |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeInfoBo.java                    |  108 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDeptVo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysMenuServiceImpl.java          |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDeptMapper.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysPostServiceImpl.java          |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDataScopeService.java             |    0 
 ruoyi-common/ruoyi-common-chat/pom.xml                                                                          |    4 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/EmbeddingServiceImpl.java            |   64 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatTokenMapper.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysRoleVo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRoleDept.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDictType.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java                 |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/OrderRequest.java              |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java     |  110 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssVo.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDictData.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysLogininforServiceImpl.java    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysNoticeStateMapper.xml                           |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TextSplitter.java                     |   18 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysNoticeStateBo.java               |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysTenantPackageService.java         |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysCache.java                          |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysTenantPackage.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/DeptTreeSelectVo.java               |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java           |   28 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysLoginService.java                  |  433 ++++
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRole.java                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDictTypeMapper.xml                              |    0 
 ruoyi-modules/ruoyi-system/pom.xml                                                                              |   14 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeInfoVo.java                    |  119 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysLogininforMapper.xml                            |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java                  |   72 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorizationService.java                 |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysNoticeBo.java                    |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/MarkdownTextSplitter.java             |   17 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeInfoMapper.java                   |   16 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/EmbeddingService.java                     |   20 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatVisitorUsageMapper.java            |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatPluginMapper.java                  |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java                         |    6 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysPostVo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserServiceImpl.java          |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatRobConfigMapper.java                        |   16 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysConfigService.java                |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeFragmentServiceImpl.java    |  113 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserInfoVo.java                  |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitImagineDTO.java                          |   26 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysNoticeStateServiceImpl.java   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOperLogMapper.xml                               |    0 
 ruoyi-common/ruoyi-common-bom/pom.xml                                                                           |    4 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysPostBo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/ProfileVo.java                      |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitChangeDTO.java                           |   25 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatRobConfigVo.java                         |   78 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/CoverMapper.xml                                    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDept.java                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOss.java                            |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleMapper.xml                                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysUserService.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleMenuMapper.xml                              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinQrCodeCacheUtil.java               |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysTenantMapper.xml                                |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java      |  397 ++++
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysConfig.java                         |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoaderFactory.java           |   35 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/request/TranslationRequest.java                 |   29 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitSimpleChangeDTO.java                     |   17 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysTenantPackageMapper.xml                         |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/JsonFileLoader.java                  |   18 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatRobConfigBo.java                         |   72 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java        |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOperLogServiceImpl.java       |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitModalDTO.java                            |   19 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java                 |   45 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobKeywordMapper.xml                             |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysNoticeState.java                    |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/TaskConditionDTO.java                          |   14 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeAttachService.java              |   49 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/VectorStoreFactory.java     |   42 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysPostMapper.xml                                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysLogininforBo.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserRoleMapper.xml                              |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java                  |   66 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java                 |    8 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeAttachServiceImpl.java      |  114 +
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobConfigMapper.xml                              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/PaymentOrdersMapper.xml                            |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/EmailRequest.java              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeChatScanHttpUtil.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDictDataMapper.xml                              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserVo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOssConfigMapper.xml                             |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysTenantService.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/UserRequest.java               |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserProfileBo.java               |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatUsageTokenMapper.java                       |   16 
 ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysNoticeController.java            |    2 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeAttachMapper.java                 |   16 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDeptMapper.xml                                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysRoleService.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/HttpUtils.java                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/DesensitizationUtil.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDictDataVo.java                  |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/FolderLoader.java                    |   16 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatVoucherMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleMenuMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java                |   49 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDictTypeServiceImpl.java      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDictDataMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserRoleMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/CacheListInfoVo.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/XmlUtil.java                             |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysRegisterService.java               |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysMenuService.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/KeyUtils.java                            |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserOptionVo.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java                    |   55 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/LoginVo.java                        |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysNoticeServiceImpl.java        |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysTenantPackageBo.java             |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDeptServiceImpl.java          |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/WeaviateVectorStore.java    |  402 ++++
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysConfigBo.java                    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinMsgUtil.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/OrderNumberGenerator.java                |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/ISseService.java                             |   65 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOssBo.java                       |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatVoucherBo.java                           |    2 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssUploadVo.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatGptsMapper.java                    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserOnline.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysTenantBo.java                    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOssServiceImpl.java           |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatCostService.java                        |   43 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java            |   22 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysPost.java                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysNoticeService.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysMenuMapper.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java               |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserPostMapper.xml                              |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserBo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java                |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysConfigMapper.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java     |  106 +
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java                |   14 
 ruoyi-modules-api/ruoyi-chat-api/pom.xml                                                                        |    7 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysTenantServiceImpl.java        |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/TaskController.java                            |    2 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CharacterTextSplitter.java            |   64 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDictTypeBo.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDataScopeServiceImpl.java     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysRoleBo.java                      |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/WordLoader.java                      |   38 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysConfigMapper.xml                                |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/ChatController.java                            |   29 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOssConfig.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOssConfigService.java             |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CodeTextSplitter.java                 |   18 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/BaseSubmitDTO.java                             |   16 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserExportVo.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysTenantVo.java                    |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserMapper.xml                                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/TenantListVo.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/MetaVo.java                         |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOperLogService.java               |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatUsageTokenServiceImpl.java            |  112 +
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitActionDTO.java                           |   18 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoader.java                  |   14 
 ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/CustomerBigDecimalSerialize.java             |   25 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDictDataBo.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java                    |   13 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java                       |   81 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/SubmitController.java                          |    2 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysNoticeMapper.xml                                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOssConfigServiceImpl.java     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysLogininforVo.java                |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserPost.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDictDataServiceImpl.java      |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitShortenDTO.java                          |   17 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatTokenService.java                         |    7 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeFragmentVo.java                |   74 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeFragmentMapper.java               |   16 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysPackagePlanMapper.xml                           |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDictDataService.java              |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatRobConfig.java                              |   66 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysLogininforService.java            |    0 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitDescribeDTO.java                         |   15 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/VectorizationFactory.java    |   47 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java   |   64 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysPostService.java                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOssConfigBo.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatMessageMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOssMapper.java                      |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/TextFileLoader.java                  |   37 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOperLogBo.java                   |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRoleMenu.java                       |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysLogininfor.java                     |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysTenantPackageVo.java             |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssConfigVo.java                 |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TokenTextSplitter.java                |   18 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatMessage.java                                |    2 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CodeFileLoader.java                  |   37 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeFragmentService.java            |   49 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/FileType.java                            |   91 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysTenant.java                         |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserPostMapper.java                 |    0 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/MarkDownFileLoader.java              |   38 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/PdfFileLoader.java                   |   35 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/CaptchaVo.java                      |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobRelationMapper.xml                            |    0 
 /dev/null                                                                                                       |    5 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOssService.java                   |    0 
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatUsageTokenService.java                    |   49 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysMenuMapper.xml                                  |    0 
 ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysModelMapper.xml                                 |    0 
 ruoyi-common/ruoyi-common-core/pom.xml                                                                          |   20 
 ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java              |   13 
 289 files changed, 5,455 insertions(+), 96 deletions(-)

diff --git a/pom.xml b/pom.xml
index d8d596c..78d6758 100644
--- a/pom.xml
+++ b/pom.xml
@@ -244,18 +244,6 @@
                 <version>${tencent.sms.version}</version>
             </dependency>
 
-            <!--            <dependency>-->
-            <!--                <groupId>de.codecentric</groupId>-->
-            <!--                <artifactId>spring-boot-admin-starter-server</artifactId>-->
-            <!--                <version>${spring-boot-admin.version}</version>-->
-            <!--            </dependency>-->
-            <!--            <dependency>-->
-            <!--                <groupId>de.codecentric</groupId>-->
-            <!--                <artifactId>spring-boot-admin-starter-client</artifactId>-->
-            <!--                <version>${spring-boot-admin.version}</version>-->
-            <!--            </dependency>-->
-
-            <!--redisson-->
             <dependency>
                 <groupId>org.redisson</groupId>
                 <artifactId>redisson-spring-boot-starter</artifactId>
@@ -321,10 +309,15 @@
                 <version>${revision}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-knowledge-api</artifactId>
+                <version>${revision}</version>
+            </dependency>
 
             <dependency>
                 <groupId>org.ruoyi</groupId>
-                <artifactId>ruoyi-knowledge</artifactId>
+                <artifactId>ruoyi-system-api</artifactId>
                 <version>${revision}</version>
             </dependency>
 
@@ -347,11 +340,6 @@
         <module>ruoyi-common</module>
         <module>ruoyi-modules</module>
         <module>ruoyi-modules-api</module>
-        <module>ruoyi-modules-api</module>
-        <module>ruoyi-modules-api/ruoyi-device-api</module>
-        <module>ruoyi-modules-api/ruoyi-weixin-api</module>
-        <module>ruoyi-modules/ruoyi-weixin</module>
-        <module>ruoyi-modules/ruoyi-device</module>
     </modules>
 
     <packaging>pom</packaging>
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 2adc1ba..a7d9e11 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -166,14 +166,11 @@
                 <version>${revision}</version>
             </dependency>
 
-            <!-- AI缁樼敾 -->
             <dependency>
                 <groupId>org.ruoyi</groupId>
                 <artifactId>ruoyi-chat</artifactId>
                 <version>${revision}</version>
             </dependency>
-
-
 
             <!-- 鏀粯妯″潡 -->
             <dependency>
@@ -182,6 +179,7 @@
                 <version>${revision}</version>
             </dependency>
         </dependencies>
+
     </dependencyManagement>
 
 </project>
diff --git a/ruoyi-common/ruoyi-common-chat/pom.xml b/ruoyi-common/ruoyi-common-chat/pom.xml
index b06f19c..63a5fb9 100644
--- a/ruoyi-common/ruoyi-common-chat/pom.xml
+++ b/ruoyi-common/ruoyi-common-chat/pom.xml
@@ -98,10 +98,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-        </dependency>
 
         <dependency>
             <groupId>cn.bigmodel.openapi</groupId>
diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml
index 36bd0d8..fe3897d 100644
--- a/ruoyi-common/ruoyi-common-core/pom.xml
+++ b/ruoyi-common/ruoyi-common-core/pom.xml
@@ -47,25 +47,11 @@
             <artifactId>jakarta.servlet-api</artifactId>
         </dependency>
 
+        <!-- hutool宸ュ叿妯″潡 -->
         <dependency>
             <groupId>cn.hutool</groupId>
-            <artifactId>hutool-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-http</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-extra</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-json</artifactId>
-            <scope>provided</scope>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.24</version>
         </dependency>
 
         <dependency>
diff --git a/ruoyi-modules-api/pom.xml b/ruoyi-modules-api/pom.xml
index 5acc710..fe4d2c2 100644
--- a/ruoyi-modules-api/pom.xml
+++ b/ruoyi-modules-api/pom.xml
@@ -12,9 +12,11 @@
     <artifactId>ruoyi-modules-api</artifactId>
     <packaging>pom</packaging>
     <modules>
-        <module>ruoyi-system-api</module>
         <module>ruoyi-chat-api</module>
+        <module>ruoyi-device-api</module>
         <module>ruoyi-knowledge-api</module>
+        <module>ruoyi-system-api</module>
+        <module>ruoyi-weixin-api</module>
     </modules>
 
     <properties>
@@ -24,13 +26,11 @@
     </properties>
 
     <dependencies>
-
         <!-- 绯荤粺鏍稿績妯″潡 -->
         <dependency>
             <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-common-core</artifactId>
         </dependency>
-
 
         <!-- mybaits鍩虹妯″潡 -->
         <dependency>
@@ -38,13 +38,11 @@
             <artifactId>ruoyi-common-mybatis</artifactId>
         </dependency>
 
-
         <!-- 鑴辨晱妯″潡 -->
         <dependency>
             <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-common-sensitive</artifactId>
         </dependency>
-
 
         <!-- excel妯″潡-->
         <dependency>
@@ -52,10 +50,31 @@
             <artifactId>ruoyi-common-excel</artifactId>
         </dependency>
 
+        <!-- 绉熸埛鍩虹妯″潡 -->
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <!-- 瀛楁缈昏瘧鍩虹妯″潡 -->
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+
+        <!-- 绯荤粺鏃ュ織妯″潡 -->
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <!-- 瀵硅薄瀛樺偍妯″潡 -->
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-common-oss</artifactId>
+        </dependency>
+
 
     </dependencies>
-
-
-
 
 </project>
diff --git a/ruoyi-modules-api/ruoyi-chat-api/pom.xml b/ruoyi-modules-api/ruoyi-chat-api/pom.xml
index fde7a46..bca2ede 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/pom.xml
+++ b/ruoyi-modules-api/ruoyi-chat-api/pom.xml
@@ -17,6 +17,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
+    <!-- 鑱婂ぉ鍩虹妯″潡 -->
+    <dependencies>
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-common-chat</artifactId>
+        </dependency>
+    </dependencies>
 
 
 </project>
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatMessage.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatMessage.java
index b9caf73..732d9d7 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatMessage.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatMessage.java
@@ -46,8 +46,6 @@
 
     /**
      * 鎵i櫎閲戦
-
-
      */
     private BigDecimal deductCost;
 
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatRobConfig.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatRobConfig.java
new file mode 100644
index 0000000..b2120bf
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatRobConfig.java
@@ -0,0 +1,66 @@
+package org.ruoyi.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 鑱婂ぉ鏈哄櫒浜洪厤缃璞� chat_rob_config
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("chat_rob_config")
+public class ChatRobConfig extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鎵�灞炵敤鎴�
+     */
+    private Long userId;
+
+    /**
+     * 鏈哄櫒浜哄悕绉�
+     */
+    private String botName;
+
+    /**
+     * 鏈哄櫒鍞竴鐮�
+     */
+    private String uniqueKey;
+
+    /**
+     * 榛樿濂藉弸鍥炲寮�鍏�
+     */
+    private String defaultFriend;
+
+    /**
+     * 榛樿缇ゅ洖澶嶅紑鍏�
+     */
+    private String defaultGroup;
+
+    /**
+     * 鏈哄櫒浜虹姸鎬�  0姝e父 1鍚敤
+     */
+    private String enable;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatUsageToken.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatUsageToken.java
new file mode 100644
index 0000000..cc15a3d
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatUsageToken.java
@@ -0,0 +1,51 @@
+package org.ruoyi.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 鐢ㄦ埛token浣跨敤璇︽儏瀵硅薄 chat_usage_token
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("chat_usage_token")
+public class ChatUsageToken extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛
+     */
+    private Long userId;
+
+    /**
+     * 寰呯粨绠梩oken
+     */
+    private Integer token;
+
+    /**
+     * 妯″瀷鍚嶇О
+     */
+    private String modelName;
+
+    /**
+     * 绱浣跨敤token
+     */
+    private String totalToken;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatRobConfigBo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatRobConfigBo.java
new file mode 100644
index 0000000..60cb384
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatRobConfigBo.java
@@ -0,0 +1,72 @@
+package org.ruoyi.domain.bo;
+
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.core.validate.EditGroup;
+import org.ruoyi.domain.ChatRobConfig;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鑱婂ぉ鏈哄櫒浜洪厤缃笟鍔″璞� chat_rob_config
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ChatRobConfig.class, reverseConvertGenerate = false)
+public class ChatRobConfigBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鎵�灞炵敤鎴�
+     */
+    @NotNull(message = "鎵�灞炵敤鎴蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 鏈哄櫒浜哄悕绉�
+     */
+    @NotBlank(message = "鏈哄櫒浜哄悕绉颁笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String botName;
+
+    /**
+     * 鏈哄櫒鍞竴鐮�
+     */
+    @NotBlank(message = "鏈哄櫒鍞竴鐮佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String uniqueKey;
+
+    /**
+     * 榛樿濂藉弸鍥炲寮�鍏�
+     */
+    @NotBlank(message = "榛樿濂藉弸鍥炲寮�鍏充笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String defaultFriend;
+
+    /**
+     * 榛樿缇ゅ洖澶嶅紑鍏�
+     */
+    @NotBlank(message = "榛樿缇ゅ洖澶嶅紑鍏充笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String defaultGroup;
+
+    /**
+     * 鏈哄櫒浜虹姸鎬�  0姝e父 1鍚敤
+     */
+    @NotBlank(message = "鏈哄櫒浜虹姸鎬�  0姝e父 1鍚敤涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String enable;
+
+    /**
+     * 澶囨敞
+     */
+    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatUsageTokenBo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatUsageTokenBo.java
new file mode 100644
index 0000000..59823d0
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatUsageTokenBo.java
@@ -0,0 +1,54 @@
+package org.ruoyi.domain.bo;
+
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.core.validate.EditGroup;
+import org.ruoyi.domain.ChatUsageToken;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鐢ㄦ埛token浣跨敤璇︽儏涓氬姟瀵硅薄 chat_usage_token
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ChatUsageToken.class, reverseConvertGenerate = false)
+public class ChatUsageTokenBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛
+     */
+    @NotNull(message = "鐢ㄦ埛涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 寰呯粨绠梩oken
+     */
+    @NotNull(message = "寰呯粨绠梩oken涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Integer token;
+
+    /**
+     * 妯″瀷鍚嶇О
+     */
+    @NotBlank(message = "妯″瀷鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String modelName;
+
+    /**
+     * 绱浣跨敤token
+     */
+    @NotBlank(message = "绱浣跨敤token涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String totalToken;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatVoucherBo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatVoucherBo.java
index 35782a7..9c6a83d 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatVoucherBo.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatVoucherBo.java
@@ -2,7 +2,7 @@
 
 import org.ruoyi.common.core.validate.AddGroup;
 import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.system.domain.ChatVoucher;
+import org.ruoyi.domain.ChatVoucher;
 import org.ruoyi.common.mybatis.core.domain.BaseEntity;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/request/TranslationRequest.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/request/TranslationRequest.java
new file mode 100644
index 0000000..c8121e7
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/request/TranslationRequest.java
@@ -0,0 +1,29 @@
+package org.ruoyi.domain.request;
+
+import lombok.Data;
+
+/**
+ * 鎻忚堪锛氱炕璇戣姹傚璞�
+ *
+ * @author ageerle@163.com
+ * date 2025/1/13
+ */
+
+@Data
+public class TranslationRequest {
+    /**
+     * 鎻愮ず璇�
+     */
+    private String prompt;
+
+    /**
+     * 妯″瀷鍚嶇О
+     */
+    private String model;
+
+    /**
+     * 鐩爣璇█
+     */
+    private String targetLanguage;
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatRobConfigVo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatRobConfigVo.java
new file mode 100644
index 0000000..247ebe2
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatRobConfigVo.java
@@ -0,0 +1,78 @@
+package org.ruoyi.domain.vo;
+
+import org.ruoyi.domain.ChatRobConfig;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 鑱婂ぉ鏈哄櫒浜洪厤缃鍥惧璞� chat_rob_config
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ChatRobConfig.class)
+public class ChatRobConfigVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ExcelProperty(value = "涓婚敭")
+    private Long id;
+
+    /**
+     * 鎵�灞炵敤鎴�
+     */
+    @ExcelProperty(value = "鎵�灞炵敤鎴�")
+    private Long userId;
+
+    /**
+     * 鏈哄櫒浜哄悕绉�
+     */
+    @ExcelProperty(value = "鏈哄櫒浜哄悕绉�")
+    private String botName;
+
+    /**
+     * 鏈哄櫒鍞竴鐮�
+     */
+    @ExcelProperty(value = "鏈哄櫒鍞竴鐮�")
+    private String uniqueKey;
+
+    /**
+     * 榛樿濂藉弸鍥炲寮�鍏�
+     */
+    @ExcelProperty(value = "榛樿濂藉弸鍥炲寮�鍏�")
+    private String defaultFriend;
+
+    /**
+     * 榛樿缇ゅ洖澶嶅紑鍏�
+     */
+    @ExcelProperty(value = "榛樿缇ゅ洖澶嶅紑鍏�")
+    private String defaultGroup;
+
+    /**
+     * 鏈哄櫒浜虹姸鎬�  0姝e父 1鍚敤
+     */
+    @ExcelProperty(value = "鏈哄櫒浜虹姸鎬�  0姝e父 1鍚敤")
+    private String enable;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatUsageTokenVo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatUsageTokenVo.java
new file mode 100644
index 0000000..e8f279d
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatUsageTokenVo.java
@@ -0,0 +1,61 @@
+package org.ruoyi.domain.vo;
+
+import org.ruoyi.domain.ChatUsageToken;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 鐢ㄦ埛token浣跨敤璇︽儏瑙嗗浘瀵硅薄 chat_usage_token
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ChatUsageToken.class)
+public class ChatUsageTokenVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ExcelProperty(value = "涓婚敭")
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛
+     */
+    @ExcelProperty(value = "鐢ㄦ埛")
+    private Long userId;
+
+    /**
+     * 寰呯粨绠梩oken
+     */
+    @ExcelProperty(value = "寰呯粨绠梩oken")
+    private Integer token;
+
+    /**
+     * 妯″瀷鍚嶇О
+     */
+    @ExcelProperty(value = "妯″瀷鍚嶇О")
+    private String modelName;
+
+    /**
+     * 绱浣跨敤token
+     */
+    @ExcelProperty(value = "绱浣跨敤token")
+    private String totalToken;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatVoucherVo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatVoucherVo.java
index b1a6c6c..8b7092d 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatVoucherVo.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatVoucherVo.java
@@ -1,12 +1,13 @@
 package org.ruoyi.domain.vo;
 
 import java.math.BigDecimal;
-import org.ruoyi.system.domain.ChatVoucher;
+
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.ruoyi.domain.ChatVoucher;
 
 import java.io.Serial;
 import java.io.Serializable;
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatRobConfigMapper.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatRobConfigMapper.java
new file mode 100644
index 0000000..fb6d0c9
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatRobConfigMapper.java
@@ -0,0 +1,16 @@
+package org.ruoyi.mapper;
+
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+import org.ruoyi.domain.ChatRobConfig;
+import org.ruoyi.domain.vo.ChatRobConfigVo;
+
+/**
+ * 鑱婂ぉ鏈哄櫒浜洪厤缃甅apper鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface ChatRobConfigMapper extends BaseMapperPlus<ChatRobConfig, ChatRobConfigVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatUsageTokenMapper.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatUsageTokenMapper.java
new file mode 100644
index 0000000..206f900
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/mapper/ChatUsageTokenMapper.java
@@ -0,0 +1,16 @@
+package org.ruoyi.mapper;
+
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+import org.ruoyi.domain.ChatUsageToken;
+import org.ruoyi.domain.vo.ChatUsageTokenVo;
+
+/**
+ * 鐢ㄦ埛token浣跨敤璇︽儏Mapper鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface ChatUsageTokenMapper extends BaseMapperPlus<ChatUsageToken, ChatUsageTokenVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatCostService.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatCostService.java
deleted file mode 100644
index e5825b0..0000000
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatCostService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.ruoyi.service;
-
-import org.ruoyi.domain.bo.ChatMessageBo;
-
-public interface IChatCostService {
-
-    /**
-     * 鏍规嵁娑堣�楃殑tokens鎵i櫎浣欓
-     *
-     * @param chatMessageBo
-     * @return 缁撴灉
-     */
-
-    void deductToken(ChatMessageBo chatMessageBo);
-
-    /**
-     * 鎵i櫎鐢ㄦ埛鐨勪綑棰�
-     *
-     */
-    void deductUserBalance(Long userId, Double numberCost);
-
-
-    /**
-     * 鎵i櫎浠诲姟璐圭敤骞朵笖淇濆瓨璁板綍
-     *
-     * @param type 浠诲姟绫诲瀷
-     * @param prompt 浠诲姟鎻忚堪
-     * @param cost 鎵i櫎璐圭敤
-     */
-    void taskDeduct(String type,String prompt, double cost);
-
-
-    /**
-     * 鍒ゆ柇鐢ㄦ埛鏄惁浠樿垂
-     */
-    void checkUserGrade();
-}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java
index 9657b59..82dd621 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java
@@ -46,4 +46,10 @@
      * 鏍¢獙骞舵壒閲忓垹闄よ亰澶╂ā鍨嬩俊鎭�
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+    /**
+     * 閫氳繃妯″瀷鍚嶇О鑾峰彇妯″瀷淇℃伅
+     */
+    ChatModelVo selectModelByName(String modelName);
 }
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatTokenService.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatTokenService.java
index 7eb1b1f..d2aca24 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatTokenService.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatTokenService.java
@@ -5,8 +5,8 @@
 /**
  * 鑱婂ぉ娑堟伅Service鎺ュ彛
  *
- * @author Lion Li
- * @date 2023-11-26
+ * @author ageerle
+ * @date 2025-04-08
  */
 public interface IChatTokenService {
 
@@ -20,6 +20,9 @@
      */
     void resetToken(Long userId,String modelName);
 
+    /**
+     * 淇敼鐢ㄦ埛token
+     */
     void editToken(ChatToken chatToken);
 
 }
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatUsageTokenService.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatUsageTokenService.java
new file mode 100644
index 0000000..3f757f1
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatUsageTokenService.java
@@ -0,0 +1,49 @@
+package org.ruoyi.service;
+
+
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.common.mybatis.core.page.PageQuery;
+import org.ruoyi.domain.bo.ChatUsageTokenBo;
+import org.ruoyi.domain.vo.ChatUsageTokenVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐢ㄦ埛token浣跨敤璇︽儏Service鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface IChatUsageTokenService {
+
+    /**
+     * 鏌ヨ鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    ChatUsageTokenVo queryById(Long id);
+
+    /**
+     * 鏌ヨ鐢ㄦ埛token浣跨敤璇︽儏鍒楄〃
+     */
+    TableDataInfo<ChatUsageTokenVo> queryPageList(ChatUsageTokenBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ鐢ㄦ埛token浣跨敤璇︽儏鍒楄〃
+     */
+    List<ChatUsageTokenVo> queryList(ChatUsageTokenBo bo);
+
+    /**
+     * 鏂板鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    Boolean insertByBo(ChatUsageTokenBo bo);
+
+    /**
+     * 淇敼鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    Boolean updateByBo(ChatUsageTokenBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ょ敤鎴穞oken浣跨敤璇︽儏淇℃伅
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatVisitorUsageService.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatVisitorUsageService.java
index 20c3926..5df31cc 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatVisitorUsageService.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatVisitorUsageService.java
@@ -11,8 +11,8 @@
 /**
  * 璁垮绠$悊Service鎺ュ彛
  *
- * @author Lion Li
- * @date 2024-07-14
+ * @author ageerle
+ * @date 2025-04-08
  */
 public interface IChatVisitorUsageService {
 
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java
index 26d4533..c136bb1 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java
@@ -115,4 +115,12 @@
         }
         return baseMapper.deleteBatchIds(ids) > 0;
     }
+
+    /**
+     * 閫氳繃妯″瀷鍚嶇О鑾峰彇妯″瀷淇℃伅
+     */
+    @Override
+    public ChatModelVo selectModelByName(String modelName) {
+       return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getModelName, modelName));
+    }
 }
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatUsageTokenServiceImpl.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatUsageTokenServiceImpl.java
new file mode 100644
index 0000000..57565ba
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatUsageTokenServiceImpl.java
@@ -0,0 +1,112 @@
+package org.ruoyi.service.impl;
+
+import org.ruoyi.common.core.utils.MapstructUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.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.ruoyi.domain.ChatUsageToken;
+import org.ruoyi.domain.bo.ChatUsageTokenBo;
+import org.ruoyi.domain.vo.ChatUsageTokenVo;
+import org.ruoyi.mapper.ChatUsageTokenMapper;
+import org.ruoyi.service.IChatUsageTokenService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鐢ㄦ埛token浣跨敤璇︽儏Service涓氬姟灞傚鐞�
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@RequiredArgsConstructor
+@Service
+public class ChatUsageTokenServiceImpl implements IChatUsageTokenService {
+
+    private final ChatUsageTokenMapper baseMapper;
+
+    /**
+     * 鏌ヨ鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    @Override
+    public ChatUsageTokenVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鏌ヨ鐢ㄦ埛token浣跨敤璇︽儏鍒楄〃
+     */
+    @Override
+    public TableDataInfo<ChatUsageTokenVo> queryPageList(ChatUsageTokenBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ChatUsageToken> lqw = buildQueryWrapper(bo);
+        Page<ChatUsageTokenVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ鐢ㄦ埛token浣跨敤璇︽儏鍒楄〃
+     */
+    @Override
+    public List<ChatUsageTokenVo> queryList(ChatUsageTokenBo bo) {
+        LambdaQueryWrapper<ChatUsageToken> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ChatUsageToken> buildQueryWrapper(ChatUsageTokenBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ChatUsageToken> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getUserId() != null, ChatUsageToken::getUserId, bo.getUserId());
+        lqw.eq(bo.getToken() != null, ChatUsageToken::getToken, bo.getToken());
+        lqw.like(StringUtils.isNotBlank(bo.getModelName()), ChatUsageToken::getModelName, bo.getModelName());
+        lqw.eq(StringUtils.isNotBlank(bo.getTotalToken()), ChatUsageToken::getTotalToken, bo.getTotalToken());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    @Override
+    public Boolean insertByBo(ChatUsageTokenBo bo) {
+        ChatUsageToken add = MapstructUtils.convert(bo, ChatUsageToken.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    @Override
+    public Boolean updateByBo(ChatUsageTokenBo bo) {
+        ChatUsageToken update = MapstructUtils.convert(bo, ChatUsageToken.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(ChatUsageToken entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄦ埛token浣跨敤璇︽儏
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml b/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
index 1ba1e99..cf1e031 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
@@ -17,4 +17,35 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
+    <dependencies>
+
+        <!-- pdf瑙f瀽鍣� -->
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>2.0.27</version>
+        </dependency>
+
+        <!-- ollama java sdk -->
+        <dependency>
+            <groupId>io.github.ollama4j</groupId>
+            <artifactId>ollama4j</artifactId>
+            <version>1.0.79</version>
+        </dependency>
+
+        <!-- milvus java sdk -->
+        <dependency>
+            <groupId>io.milvus</groupId>
+            <artifactId>milvus-sdk-java</artifactId>
+            <version>2.3.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.weaviate</groupId>
+            <artifactId>client</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+
+    </dependencies>
+
 </project>
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CodeFileLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CodeFileLoader.java
new file mode 100644
index 0000000..9323141
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CodeFileLoader.java
@@ -0,0 +1,37 @@
+package org.ruoyi.chain.loader;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class CodeFileLoader implements ResourceLoader {
+    private final TextSplitter textSplitter;
+    @Override
+    public String getContent(InputStream inputStream) {
+        StringBuffer stringBuffer = new StringBuffer();
+        try (InputStreamReader reader = new InputStreamReader(inputStream);
+             BufferedReader bufferedReader = new BufferedReader(reader)){
+            String line;
+            while ((line = bufferedReader.readLine()) != null) {
+                stringBuffer.append(line).append("\n");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return stringBuffer.toString();
+    }
+    @Override
+    public List<String> getChunkList(String content, String kid){
+        return textSplitter.split(content, kid);
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CsvFileLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CsvFileLoader.java
new file mode 100644
index 0000000..37d9903
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/CsvFileLoader.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chain.loader;
+
+import org.ruoyi.chain.loader.ResourceLoader;
+
+import java.io.InputStream;
+import java.util.List;
+
+public class CsvFileLoader implements ResourceLoader {
+    @Override
+    public String getContent(InputStream inputStream) {
+        return null;
+    }
+
+    @Override
+    public List<String> getChunkList(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/FolderLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/FolderLoader.java
new file mode 100644
index 0000000..7422d31
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/FolderLoader.java
@@ -0,0 +1,16 @@
+package org.ruoyi.chain.loader;
+
+import java.io.InputStream;
+import java.util.List;
+
+public class FolderLoader implements ResourceLoader{
+    @Override
+    public String getContent(InputStream inputStream) {
+        return null;
+    }
+
+    @Override
+    public List<String> getChunkList(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/GithubLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/GithubLoader.java
new file mode 100644
index 0000000..55446ef
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/GithubLoader.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chain.loader;
+
+import org.ruoyi.chain.loader.ResourceLoader;
+
+import java.io.InputStream;
+import java.util.List;
+
+public class GithubLoader implements ResourceLoader {
+    @Override
+    public String getContent(InputStream inputStream) {
+        return null;
+    }
+
+    @Override
+    public List<String> getChunkList(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/JsonFileLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/JsonFileLoader.java
new file mode 100644
index 0000000..35f3fd4
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/JsonFileLoader.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chain.loader;
+
+import org.ruoyi.chain.loader.ResourceLoader;
+
+import java.io.InputStream;
+import java.util.List;
+
+public class JsonFileLoader implements ResourceLoader {
+    @Override
+    public String getContent(InputStream inputStream) {
+        return null;
+    }
+
+    @Override
+    public List<String> getChunkList(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/MarkDownFileLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/MarkDownFileLoader.java
new file mode 100644
index 0000000..182d0a7
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/MarkDownFileLoader.java
@@ -0,0 +1,38 @@
+package org.ruoyi.chain.loader;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chain.loader.ResourceLoader;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class MarkDownFileLoader implements ResourceLoader {
+    private final TextSplitter textSplitter;
+    @Override
+    public String getContent(InputStream inputStream) {
+        StringBuffer stringBuffer = new StringBuffer();
+        try (InputStreamReader reader = new InputStreamReader(inputStream);
+             BufferedReader bufferedReader = new BufferedReader(reader)){
+            String line;
+            while ((line = bufferedReader.readLine()) != null) {
+                stringBuffer.append(line).append("\n");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return stringBuffer.toString();
+    }
+    @Override
+    public List<String> getChunkList(String content, String kid){
+        return textSplitter.split(content, kid);
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/PdfFileLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/PdfFileLoader.java
new file mode 100644
index 0000000..06e74b8
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/PdfFileLoader.java
@@ -0,0 +1,35 @@
+package org.ruoyi.chain.loader;
+
+import lombok.AllArgsConstructor;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.text.PDFTextStripper;
+import org.ruoyi.chain.loader.ResourceLoader;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+public class PdfFileLoader implements ResourceLoader {
+    private final TextSplitter characterTextSplitter;
+    @Override
+    public String getContent(InputStream inputStream) {
+        PDDocument document = null;
+        try {
+            document = PDDocument.load(inputStream);
+            PDFTextStripper textStripper = new PDFTextStripper();
+            String content = textStripper.getText(document);
+            return content;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public List<String> getChunkList(String content, String kid) {
+        return characterTextSplitter.split(content, kid);
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoader.java
new file mode 100644
index 0000000..9a91cdd
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoader.java
@@ -0,0 +1,14 @@
+package org.ruoyi.chain.loader;
+
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * 璧勬簮杞藉叆
+ */
+public interface ResourceLoader {
+
+    String getContent(InputStream inputStream);
+
+    List<String> getChunkList(String content, String kid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoaderFactory.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoaderFactory.java
new file mode 100644
index 0000000..6aca900
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/ResourceLoaderFactory.java
@@ -0,0 +1,35 @@
+package org.ruoyi.chain.loader;
+
+import lombok.AllArgsConstructor;
+import org.ruoyi.chain.loader.ResourceLoader;
+import org.ruoyi.chain.loader.TextFileLoader;
+import org.ruoyi.chain.split.CharacterTextSplitter;
+import org.ruoyi.chain.split.CodeTextSplitter;
+import org.ruoyi.chain.split.MarkdownTextSplitter;
+import org.ruoyi.chain.split.TokenTextSplitter;
+import org.ruoyi.knowledge.constant.FileType;
+import org.springframework.stereotype.Component;
+
+@AllArgsConstructor
+@Component
+public class ResourceLoaderFactory {
+    private final CharacterTextSplitter characterTextSplitter;
+    private final CodeTextSplitter codeTextSplitter;
+    private final MarkdownTextSplitter markdownTextSplitter;
+    private final TokenTextSplitter tokenTextSplitter;
+    public ResourceLoader getLoaderByFileType(String fileType){
+        if (FileType.isTextFile(fileType)){
+            return new TextFileLoader(characterTextSplitter);
+        } else if (FileType.isWord(fileType)) {
+            return new WordLoader(characterTextSplitter);
+        } else if (FileType.isPdf(fileType)) {
+            return new PdfFileLoader(characterTextSplitter);
+        } else if (FileType.isMdFile(fileType)) {
+            return new MarkDownFileLoader(markdownTextSplitter);
+        }else if (FileType.isCodeFile(fileType)) {
+            return new CodeFileLoader(codeTextSplitter);
+        }else {
+            return new TextFileLoader(characterTextSplitter);
+        }
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/TextFileLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/TextFileLoader.java
new file mode 100644
index 0000000..da3051e
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/TextFileLoader.java
@@ -0,0 +1,37 @@
+package org.ruoyi.chain.loader;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class TextFileLoader implements ResourceLoader{
+    private final TextSplitter textSplitter;
+    @Override
+    public String getContent(InputStream inputStream) {
+        StringBuffer stringBuffer = new StringBuffer();
+        try (InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
+             BufferedReader bufferedReader = new BufferedReader(reader)){
+            String line;
+            while ((line = bufferedReader.readLine()) != null) {
+                stringBuffer.append(line).append("\n");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return stringBuffer.toString();
+    }
+    @Override
+    public List<String> getChunkList(String content, String kid){
+        return textSplitter.split(content, kid);
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/WordLoader.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/WordLoader.java
new file mode 100644
index 0000000..624f01b
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/loader/WordLoader.java
@@ -0,0 +1,38 @@
+package org.ruoyi.chain.loader;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.ruoyi.chain.loader.ResourceLoader;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class WordLoader implements ResourceLoader {
+    private final TextSplitter textSplitter;
+    @Override
+    public String getContent(InputStream inputStream) {
+        XWPFDocument document = null;
+        try {
+            document = new XWPFDocument(inputStream);
+            XWPFWordExtractor extractor = new XWPFWordExtractor(document);
+            String content = extractor.getText();
+            return content;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public List<String> getChunkList(String content, String kid) {
+        return textSplitter.split(content, kid);
+    }
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CharacterTextSplitter.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CharacterTextSplitter.java
new file mode 100644
index 0000000..83ca334
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CharacterTextSplitter.java
@@ -0,0 +1,64 @@
+package org.ruoyi.chain.split;
+
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.chain.split.TextSplitter;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IKnowledgeInfoService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Component
+@Slf4j
+@Primary
+public class CharacterTextSplitter implements TextSplitter {
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    @Override
+    public List<String> split(String content, String kid) {
+        // 浠庣煡璇嗗簱琛ㄤ腑鑾峰彇閰嶇疆
+        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+        String knowledgeSeparator = knowledgeInfoVo.getKnowledgeSeparator();
+        int textBlockSize = knowledgeInfoVo.getTextBlockSize();
+        int overlapChar = knowledgeInfoVo.getOverlapChar();
+        List<String> chunkList = new ArrayList<>();
+        if (content.contains(knowledgeSeparator) && StringUtils.isNotBlank(knowledgeSeparator)) {
+            // 鎸夎嚜瀹氫箟鍒嗛殧绗﹀垏鍒�
+            String[] chunks = content.split(knowledgeSeparator);
+            chunkList.addAll(Arrays.asList(chunks));
+        } else {
+            int indexMin = 0;
+            int len = content.length();
+            int i = 0;
+            int right = 0;
+            while (true) {
+                if (len > right) {
+                    int begin = i * textBlockSize - overlapChar;
+                    if (begin < indexMin) {
+                        begin = indexMin;
+                    }
+                    int end = textBlockSize * (i + 1) + overlapChar;
+                    if (end > len) {
+                        end = len;
+                    }
+                    String chunk = content.substring(begin, end);
+                    chunkList.add(chunk);
+                    i++;
+                    right = right + textBlockSize;
+                } else {
+                    break;
+                }
+            }
+        }
+        return chunkList;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CodeTextSplitter.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CodeTextSplitter.java
new file mode 100644
index 0000000..f082ec8
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/CodeTextSplitter.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chain.split;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class CodeTextSplitter implements TextSplitter {
+    @Override
+    public List<String> split(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/MarkdownTextSplitter.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/MarkdownTextSplitter.java
new file mode 100644
index 0000000..299cc43
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/MarkdownTextSplitter.java
@@ -0,0 +1,17 @@
+package org.ruoyi.chain.split;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class MarkdownTextSplitter implements TextSplitter{
+    @Override
+    public List<String> split(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TextSplitter.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TextSplitter.java
new file mode 100644
index 0000000..93b5d57
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TextSplitter.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chain.split;
+
+import java.util.List;
+
+/**
+ * 鏂囨湰鍒囧垎
+ */
+public interface TextSplitter {
+
+    /**
+     * 鏂囨湰鍒囧垎
+     *
+     * @param content 鏂囨湰鍐呭
+     * @param kid     鐭ヨ瘑搴搃d
+     * @return 鍒囧垎鍚庣殑鏂囨湰鍒楄〃
+     */
+    List<String> split(String content, String kid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TokenTextSplitter.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TokenTextSplitter.java
new file mode 100644
index 0000000..823014a
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/chain/split/TokenTextSplitter.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chain.split;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chain.split.TextSplitter;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+@Slf4j
+public class TokenTextSplitter implements TextSplitter {
+    @Override
+    public List<String> split(String content, String kid) {
+        return null;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/FileType.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/FileType.java
new file mode 100644
index 0000000..aa14167
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/FileType.java
@@ -0,0 +1,91 @@
+package org.ruoyi.constant;
+
+public class FileType {
+    public static final String TXT = "txt";
+    public static final String CSV = "csv";
+    public static final String MD = "md";
+    public static final String DOC = "doc";
+    public static final String DOCX = "docx";
+    public static final String PDF = "pdf";
+
+    public static final String LOG = "log";
+    public static final String XML = "xml";
+
+    public static final String JAVA = "java";
+    public static final String HTML = "html";
+    public static final String HTM = "htm";
+    public static final String CSS = "css";
+    public static final String JS = "js";
+    public static final String PY = "py";
+    public static final String CPP = "cpp";
+    public static final String SQL = "sql";
+    public static final String PHP = "php";
+    public static final String RUBY = "ruby";
+    public static final String C = "c";
+    public static final String H = "h";
+    public static final String HPP = "hpp";
+    public static final String SWIFT = "swift";
+    public static final String TS = "ts";
+    public static final String RUST = "rs";
+    public static final String PERL = "perl";
+    public static final String SHELL = "shell";
+    public static final String BAT = "bat";
+    public static final String CMD = "cmd";
+
+    public static final String PROPERTIES = "properties";
+    public static final String INI = "ini";
+    public static final String YAML = "yaml";
+    public static final String YML = "yml";
+
+    public static boolean isTextFile(String type){
+        if (type.equalsIgnoreCase(TXT) || type.equalsIgnoreCase(CSV) || type.equalsIgnoreCase(PROPERTIES)
+                || type.equalsIgnoreCase(INI) || type.equalsIgnoreCase(YAML) || type.equalsIgnoreCase(YML)
+                || type.equalsIgnoreCase(LOG) || type.equalsIgnoreCase(XML)){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    public static boolean isCodeFile(String type){
+        if (type.equalsIgnoreCase(JAVA) || type.equalsIgnoreCase(HTML) || type.equalsIgnoreCase(HTM) || type.equalsIgnoreCase(JS) || type.equalsIgnoreCase(PY)
+                || type.equalsIgnoreCase(CPP) || type.equalsIgnoreCase(SQL) || type.equalsIgnoreCase(PHP) || type.equalsIgnoreCase(RUBY)
+                || type.equalsIgnoreCase(C) || type.equalsIgnoreCase(H) || type.equalsIgnoreCase(HPP) || type.equalsIgnoreCase(SWIFT)
+                || type.equalsIgnoreCase(TS) || type.equalsIgnoreCase(RUST) || type.equalsIgnoreCase(PERL) || type.equalsIgnoreCase(SHELL)
+                || type.equalsIgnoreCase(BAT) || type.equalsIgnoreCase(CMD) || type.equalsIgnoreCase(CSS)){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    public static boolean isMdFile(String type){
+        if (type.equalsIgnoreCase(MD)){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    public static boolean isWord(String type){
+        if (type.equalsIgnoreCase(DOC) || type.equalsIgnoreCase(DOCX)){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    public static boolean isPdf(String type){
+        if (type.equalsIgnoreCase(PDF)){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java
new file mode 100644
index 0000000..b72c733
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java
@@ -0,0 +1,61 @@
+package org.ruoyi.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 鐭ヨ瘑搴撻檮浠跺璞� knowledge_attach
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("knowledge_attach")
+public class KnowledgeAttach extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    private String kid;
+
+    /**
+     * 鏂囨。ID
+     */
+    private String docId;
+
+    /**
+     * 鏂囨。鍚嶇О
+     */
+    private String docName;
+
+    /**
+     * 鏂囨。绫诲瀷
+     */
+    private String docType;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    private String content;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeFragment.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeFragment.java
new file mode 100644
index 0000000..df325e6
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeFragment.java
@@ -0,0 +1,61 @@
+package org.ruoyi.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 鐭ヨ瘑鐗囨瀵硅薄 knowledge_fragment
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("knowledge_fragment")
+public class KnowledgeFragment extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    private String kid;
+
+    /**
+     * 鏂囨。ID
+     */
+    private String docId;
+
+    /**
+     * 鐭ヨ瘑鐗囨ID
+     */
+    private String fid;
+
+    /**
+     * 鐗囨绱㈠紩涓嬫爣
+     */
+    private Long idx;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    private String content;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeInfo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeInfo.java
new file mode 100644
index 0000000..02442cd
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeInfo.java
@@ -0,0 +1,96 @@
+package org.ruoyi.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 鐭ヨ瘑搴撳璞� knowledge_info
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("knowledge_info")
+public class KnowledgeInfo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    private String kid;
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    private Long uid;
+
+    /**
+     * 鐭ヨ瘑搴撳悕绉�
+     */
+    private String kname;
+
+    /**
+     * 鏄惁鍏紑鐭ヨ瘑搴擄紙0 鍚� 1鏄級
+     */
+    private Integer share;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鐭ヨ瘑鍒嗛殧绗�
+     */
+    private String knowledgeSeparator;
+
+    /**
+     * 鎻愰棶鍒嗛殧绗�
+     */
+    private String questionSeparator;
+
+    /**
+     * 閲嶅彔瀛楃鏁�
+     */
+    private Long overlapChar;
+
+    /**
+     * 鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟
+     */
+    private Long retrieveLimit;
+
+    /**
+     * 鏂囨湰鍧楀ぇ灏�
+     */
+    private Long textBlockSize;
+
+    /**
+     * 鍚戦噺搴�
+     */
+    private String vector;
+
+    /**
+     * 鍚戦噺妯″瀷
+     */
+    private String vectorModel;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java
new file mode 100644
index 0000000..e2daedb
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java
@@ -0,0 +1,66 @@
+package org.ruoyi.domain.bo;
+
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.core.validate.EditGroup;
+import org.ruoyi.domain.KnowledgeAttach;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鐭ヨ瘑搴撻檮浠朵笟鍔″璞� knowledge_attach
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = KnowledgeAttach.class, reverseConvertGenerate = false)
+public class KnowledgeAttachBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String kid;
+
+    /**
+     * 鏂囨。ID
+     */
+    @NotBlank(message = "鏂囨。ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String docId;
+
+    /**
+     * 鏂囨。鍚嶇О
+     */
+    @NotBlank(message = "鏂囨。鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String docName;
+
+    /**
+     * 鏂囨。绫诲瀷
+     */
+    @NotBlank(message = "鏂囨。绫诲瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String docType;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    @NotBlank(message = "鏂囨。鍐呭涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String content;
+
+    /**
+     * 澶囨敞
+     */
+    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeFragmentBo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeFragmentBo.java
new file mode 100644
index 0000000..a546191
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeFragmentBo.java
@@ -0,0 +1,66 @@
+package org.ruoyi.domain.bo;
+
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.core.validate.EditGroup;
+import org.ruoyi.domain.KnowledgeFragment;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鐭ヨ瘑鐗囨涓氬姟瀵硅薄 knowledge_fragment
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = KnowledgeFragment.class, reverseConvertGenerate = false)
+public class KnowledgeFragmentBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String kid;
+
+    /**
+     * 鏂囨。ID
+     */
+    @NotBlank(message = "鏂囨。ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String docId;
+
+    /**
+     * 鐭ヨ瘑鐗囨ID
+     */
+    @NotBlank(message = "鐭ヨ瘑鐗囨ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String fid;
+
+    /**
+     * 鐗囨绱㈠紩涓嬫爣
+     */
+    @NotNull(message = "鐗囨绱㈠紩涓嬫爣涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long idx;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    @NotBlank(message = "鏂囨。鍐呭涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String content;
+
+    /**
+     * 澶囨敞
+     */
+    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeInfoBo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeInfoBo.java
new file mode 100644
index 0000000..8275324
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeInfoBo.java
@@ -0,0 +1,108 @@
+package org.ruoyi.domain.bo;
+
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.core.validate.EditGroup;
+import org.ruoyi.domain.KnowledgeInfo;
+import org.ruoyi.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鐭ヨ瘑搴撲笟鍔″璞� knowledge_info
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = KnowledgeInfo.class, reverseConvertGenerate = false)
+public class KnowledgeInfoBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String kid;
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    @NotNull(message = "鐢ㄦ埛ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long uid;
+
+    /**
+     * 鐭ヨ瘑搴撳悕绉�
+     */
+    @NotBlank(message = "鐭ヨ瘑搴撳悕绉颁笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String kname;
+
+    /**
+     * 鏄惁鍏紑鐭ヨ瘑搴擄紙0 鍚� 1鏄級
+     */
+    @NotNull(message = "鏄惁鍏紑鐭ヨ瘑搴擄紙0 鍚� 1鏄級涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Integer share;
+
+    /**
+     * 鎻忚堪
+     */
+    @NotBlank(message = "鎻忚堪涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String description;
+
+    /**
+     * 鐭ヨ瘑鍒嗛殧绗�
+     */
+    @NotBlank(message = "鐭ヨ瘑鍒嗛殧绗︿笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String knowledgeSeparator;
+
+    /**
+     * 鎻愰棶鍒嗛殧绗�
+     */
+    @NotBlank(message = "鎻愰棶鍒嗛殧绗︿笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String questionSeparator;
+
+    /**
+     * 閲嶅彔瀛楃鏁�
+     */
+    @NotNull(message = "閲嶅彔瀛楃鏁颁笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Long overlapChar;
+
+    /**
+     * 鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟
+     */
+    @NotNull(message = "鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long retrieveLimit;
+
+    /**
+     * 鏂囨湰鍧楀ぇ灏�
+     */
+    @NotNull(message = "鏂囨湰鍧楀ぇ灏忎笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Long textBlockSize;
+
+    /**
+     * 鍚戦噺搴�
+     */
+    @NotBlank(message = "鍚戦噺搴撲笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String vector;
+
+    /**
+     * 鍚戦噺妯″瀷
+     */
+    @NotBlank(message = "鍚戦噺妯″瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String vectorModel;
+
+    /**
+     * 澶囨敞
+     */
+    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java
new file mode 100644
index 0000000..fb463d4
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java
@@ -0,0 +1,72 @@
+package org.ruoyi.domain.vo;
+
+import org.ruoyi.domain.KnowledgeAttach;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 鐭ヨ瘑搴撻檮浠惰鍥惧璞� knowledge_attach
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = KnowledgeAttach.class)
+public class KnowledgeAttachVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
+    private String kid;
+
+    /**
+     * 鏂囨。ID
+     */
+    @ExcelProperty(value = "鏂囨。ID")
+    private String docId;
+
+    /**
+     * 鏂囨。鍚嶇О
+     */
+    @ExcelProperty(value = "鏂囨。鍚嶇О")
+    private String docName;
+
+    /**
+     * 鏂囨。绫诲瀷
+     */
+    @ExcelProperty(value = "鏂囨。绫诲瀷")
+    private String docType;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    @ExcelProperty(value = "鏂囨。鍐呭")
+    private String content;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeFragmentVo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeFragmentVo.java
new file mode 100644
index 0000000..fcda458
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeFragmentVo.java
@@ -0,0 +1,74 @@
+package org.ruoyi.domain.vo;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.ruoyi.domain.KnowledgeFragment;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 鐭ヨ瘑鐗囨瑙嗗浘瀵硅薄 knowledge_fragment
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = KnowledgeFragment.class)
+public class KnowledgeFragmentVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
+    private String kid;
+
+    /**
+     * 鏂囨。ID
+     */
+    @ExcelProperty(value = "鏂囨。ID")
+    private String docId;
+
+    /**
+     * 鐭ヨ瘑鐗囨ID
+     */
+    @ExcelProperty(value = "鐭ヨ瘑鐗囨ID")
+    private String fid;
+
+    /**
+     * 鐗囨绱㈠紩涓嬫爣
+     */
+    @ExcelProperty(value = "鐗囨绱㈠紩涓嬫爣")
+    private Long idx;
+
+    /**
+     * 鏂囨。鍐呭
+     */
+    @ExcelProperty(value = "鏂囨。鍐呭")
+    private String content;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeInfoVo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeInfoVo.java
new file mode 100644
index 0000000..6a5fdbf
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeInfoVo.java
@@ -0,0 +1,119 @@
+package org.ruoyi.domain.vo;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.ruoyi.common.excel.annotation.ExcelDictFormat;
+import org.ruoyi.common.excel.convert.ExcelDictConvert;
+import org.ruoyi.domain.KnowledgeInfo;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 鐭ヨ瘑搴撹鍥惧璞� knowledge_info
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = KnowledgeInfo.class)
+public class KnowledgeInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 鐭ヨ瘑搴揑D
+     */
+    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
+    private String kid;
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    @ExcelProperty(value = "鐢ㄦ埛ID")
+    private Long uid;
+
+    /**
+     * 鐭ヨ瘑搴撳悕绉�
+     */
+    @ExcelProperty(value = "鐭ヨ瘑搴撳悕绉�")
+    private String kname;
+
+    /**
+     * 鏄惁鍏紑鐭ヨ瘑搴擄紙0 鍚� 1鏄級
+     */
+    @ExcelProperty(value = "鏄惁鍏紑鐭ヨ瘑搴�", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=,鍚�=,1=鏄�")
+    private Integer share;
+
+    /**
+     * 鎻忚堪
+     */
+    @ExcelProperty(value = "鎻忚堪")
+    private String description;
+
+    /**
+     * 鐭ヨ瘑鍒嗛殧绗�
+     */
+    @ExcelProperty(value = "鐭ヨ瘑鍒嗛殧绗�")
+    private String knowledgeSeparator;
+
+    /**
+     * 鎻愰棶鍒嗛殧绗�
+     */
+    @ExcelProperty(value = "鎻愰棶鍒嗛殧绗�")
+    private String questionSeparator;
+
+    /**
+     * 閲嶅彔瀛楃鏁�
+     */
+    @ExcelProperty(value = "閲嶅彔瀛楃鏁�")
+    private Integer overlapChar;
+
+    /**
+     * 鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟
+     */
+    @ExcelProperty(value = "鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟")
+    private Integer retrieveLimit;
+
+    /**
+     * 鏂囨湰鍧楀ぇ灏�
+     */
+    @ExcelProperty(value = "鏂囨湰鍧楀ぇ灏�")
+    private Integer textBlockSize;
+
+    /**
+     * 鍚戦噺搴�
+     */
+    @ExcelProperty(value = "鍚戦噺搴�")
+    private String vector;
+
+    /**
+     * 鍚戦噺妯″瀷
+     */
+    @ExcelProperty(value = "鍚戦噺妯″瀷")
+    private String vectorModel;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeAttachMapper.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeAttachMapper.java
new file mode 100644
index 0000000..c58856c
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeAttachMapper.java
@@ -0,0 +1,16 @@
+package org.ruoyi.mapper;
+
+
+import org.ruoyi.domain.KnowledgeAttach;
+import org.ruoyi.domain.vo.KnowledgeAttachVo;
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鐭ヨ瘑搴撻檮浠禡apper鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface KnowledgeAttachMapper extends BaseMapperPlus<KnowledgeAttach, KnowledgeAttachVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeFragmentMapper.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeFragmentMapper.java
new file mode 100644
index 0000000..5e73b38
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeFragmentMapper.java
@@ -0,0 +1,16 @@
+package org.ruoyi.mapper;
+
+
+import org.ruoyi.domain.KnowledgeFragment;
+import org.ruoyi.domain.vo.KnowledgeFragmentVo;
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鐭ヨ瘑鐗囨Mapper鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface KnowledgeFragmentMapper extends BaseMapperPlus<KnowledgeFragment, KnowledgeFragmentVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeInfoMapper.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeInfoMapper.java
new file mode 100644
index 0000000..47db02b
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/mapper/KnowledgeInfoMapper.java
@@ -0,0 +1,16 @@
+package org.ruoyi.mapper;
+
+
+import org.ruoyi.domain.KnowledgeInfo;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鐭ヨ瘑搴揗apper鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface KnowledgeInfoMapper extends BaseMapperPlus<KnowledgeInfo, KnowledgeInfoVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/EmbeddingService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/EmbeddingService.java
new file mode 100644
index 0000000..9884118
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/EmbeddingService.java
@@ -0,0 +1,20 @@
+package org.ruoyi.service;
+
+import java.util.List;
+
+public interface EmbeddingService {
+
+    void storeEmbeddings(List<String> chunkList, String kid, String docId,List<String> fidList);
+
+    void removeByDocId(String kid,String docId);
+
+    void removeByKid(String kid);
+
+    List<Double> getQueryVector(String query, String kid);
+
+    void createSchema(String kid);
+
+    void removeByKidAndFid(String kid, String fid);
+
+    void saveFragment(String kid, String docId, String fid, String content);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeAttachService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeAttachService.java
new file mode 100644
index 0000000..9082878
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeAttachService.java
@@ -0,0 +1,49 @@
+package org.ruoyi.service;
+
+
+import org.ruoyi.domain.bo.KnowledgeAttachBo;
+import org.ruoyi.domain.vo.KnowledgeAttachVo;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐭ヨ瘑搴撻檮浠禨ervice鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface IKnowledgeAttachService {
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撻檮浠�
+     */
+    KnowledgeAttachVo queryById(Long id);
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
+     */
+    TableDataInfo<KnowledgeAttachVo> queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
+     */
+    List<KnowledgeAttachVo> queryList(KnowledgeAttachBo bo);
+
+    /**
+     * 鏂板鐭ヨ瘑搴撻檮浠�
+     */
+    Boolean insertByBo(KnowledgeAttachBo bo);
+
+    /**
+     * 淇敼鐭ヨ瘑搴撻檮浠�
+     */
+    Boolean updateByBo(KnowledgeAttachBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ょ煡璇嗗簱闄勪欢淇℃伅
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeFragmentService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeFragmentService.java
new file mode 100644
index 0000000..5e88ef7
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeFragmentService.java
@@ -0,0 +1,49 @@
+package org.ruoyi.service;
+
+
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.common.mybatis.core.page.PageQuery;
+import org.ruoyi.domain.bo.KnowledgeFragmentBo;
+import org.ruoyi.domain.vo.KnowledgeFragmentVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐭ヨ瘑鐗囨Service鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface IKnowledgeFragmentService {
+
+    /**
+     * 鏌ヨ鐭ヨ瘑鐗囨
+     */
+    KnowledgeFragmentVo queryById(Long id);
+
+    /**
+     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
+     */
+    TableDataInfo<KnowledgeFragmentVo> queryPageList(KnowledgeFragmentBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
+     */
+    List<KnowledgeFragmentVo> queryList(KnowledgeFragmentBo bo);
+
+    /**
+     * 鏂板鐭ヨ瘑鐗囨
+     */
+    Boolean insertByBo(KnowledgeFragmentBo bo);
+
+    /**
+     * 淇敼鐭ヨ瘑鐗囨
+     */
+    Boolean updateByBo(KnowledgeFragmentBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ょ煡璇嗙墖娈典俊鎭�
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java
new file mode 100644
index 0000000..fc9d37b
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java
@@ -0,0 +1,49 @@
+package org.ruoyi.service;
+
+
+import org.ruoyi.domain.bo.KnowledgeInfoBo;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鐭ヨ瘑搴揝ervice鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface IKnowledgeInfoService {
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴�
+     */
+    KnowledgeInfoVo queryById(Long id);
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+     */
+    TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+     */
+    List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo);
+
+    /**
+     * 鏂板鐭ヨ瘑搴�
+     */
+    Boolean insertByBo(KnowledgeInfoBo bo);
+
+    /**
+     * 淇敼鐭ヨ瘑搴�
+     */
+    Boolean updateByBo(KnowledgeInfoBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ょ煡璇嗗簱淇℃伅
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java
new file mode 100644
index 0000000..d3294bb
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java
@@ -0,0 +1,23 @@
+package org.ruoyi.service;
+
+import java.util.List;
+
+/**
+ * 鍚戦噺瀛樺偍
+ */
+public interface VectorStoreService {
+
+    void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList);
+
+    void removeByDocId(String kid, String docId);
+
+    void removeByKid(String kid);
+
+    List<String> nearest(List<Double> queryVector, String kid);
+
+    List<String> nearest(String query, String kid);
+
+    void newSchema(String kid);
+
+    void removeByKidAndFid(String kid, String fid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorizationService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorizationService.java
new file mode 100644
index 0000000..8188881
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorizationService.java
@@ -0,0 +1,13 @@
+package org.ruoyi.service;
+
+import java.util.List;
+
+/**
+ * 鏂囨湰鍚戦噺鍖�
+ */
+public interface VectorizationService {
+
+    List<List<Double>> batchVectorization(List<String> chunkList, String kid);
+
+    List<Double> singleVectorization(String chunk, String kid);
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/EmbeddingServiceImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/EmbeddingServiceImpl.java
new file mode 100644
index 0000000..0065739
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/EmbeddingServiceImpl.java
@@ -0,0 +1,64 @@
+package org.ruoyi.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.ruoyi.service.EmbeddingService;
+import org.ruoyi.service.VectorStoreService;
+import org.ruoyi.service.VectorizationService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class EmbeddingServiceImpl implements EmbeddingService {
+
+    private final VectorStoreService vectorStore;
+    private final VectorizationService vectorization;
+
+    /**
+     * 淇濆瓨鍚戦噺鏁版嵁搴�
+     * @param chunkList         鏂囨。鎸夎鍒囧垎鐨勭墖娈�
+     * @param kid               鐭ヨ瘑搴揑D
+     * @param docId             鏂囨。ID
+     */
+    @Override
+    public void storeEmbeddings(List<String> chunkList, String kid, String docId,List<String> fidList) {
+        List<List<Double>> vectorList = vectorization.batchVectorization(chunkList, kid);
+        vectorStore.storeEmbeddings(chunkList,vectorList,kid,docId,fidList);
+    }
+
+    @Override
+    public void removeByDocId(String kid,String docId) {
+        vectorStore.removeByDocId(kid,docId);
+    }
+
+    @Override
+    public void removeByKid(String kid) {
+        vectorStore.removeByKid(kid);
+    }
+
+    @Override
+    public List<Double> getQueryVector(String query, String kid) {
+        return vectorization.singleVectorization(query,kid);
+    }
+
+    @Override
+    public void createSchema(String kid) {
+        vectorStore.newSchema(kid);
+    }
+
+    @Override
+    public void removeByKidAndFid(String kid, String fid) {
+        vectorStore.removeByKidAndFid(kid,fid);
+    }
+
+    @Override
+    public void saveFragment(String kid, String docId, String fid, String content) {
+        List<String> chunkList = new ArrayList<>();
+        List<String> fidList = new ArrayList<>();
+        chunkList.add(content);
+        fidList.add(fid);
+        storeEmbeddings(chunkList,kid,docId,fidList);
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeAttachServiceImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeAttachServiceImpl.java
new file mode 100644
index 0000000..6a0a571
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeAttachServiceImpl.java
@@ -0,0 +1,114 @@
+package org.ruoyi.service.impl;
+
+import org.ruoyi.common.core.utils.MapstructUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.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.ruoyi.domain.vo.KnowledgeAttachVo;
+import org.springframework.stereotype.Service;
+import org.ruoyi.domain.bo.KnowledgeAttachBo;
+
+import org.ruoyi.domain.KnowledgeAttach;
+import org.ruoyi.mapper.KnowledgeAttachMapper;
+import org.ruoyi.service.IKnowledgeAttachService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鐭ヨ瘑搴撻檮浠禨ervice涓氬姟灞傚鐞�
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@RequiredArgsConstructor
+@Service
+public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService {
+
+    private final KnowledgeAttachMapper baseMapper;
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撻檮浠�
+     */
+    @Override
+    public KnowledgeAttachVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
+     */
+    @Override
+    public TableDataInfo<KnowledgeAttachVo> queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
+        Page<KnowledgeAttachVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
+     */
+    @Override
+    public List<KnowledgeAttachVo> queryList(KnowledgeAttachBo bo) {
+        LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<KnowledgeAttach> buildQueryWrapper(KnowledgeAttachBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KnowledgeAttach> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeAttach::getKid, bo.getKid());
+        lqw.eq(StringUtils.isNotBlank(bo.getDocId()), KnowledgeAttach::getDocId, bo.getDocId());
+        lqw.like(StringUtils.isNotBlank(bo.getDocName()), KnowledgeAttach::getDocName, bo.getDocName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDocType()), KnowledgeAttach::getDocType, bo.getDocType());
+        lqw.eq(StringUtils.isNotBlank(bo.getContent()), KnowledgeAttach::getContent, bo.getContent());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鐭ヨ瘑搴撻檮浠�
+     */
+    @Override
+    public Boolean insertByBo(KnowledgeAttachBo bo) {
+        KnowledgeAttach add = MapstructUtils.convert(bo, KnowledgeAttach.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鐭ヨ瘑搴撻檮浠�
+     */
+    @Override
+    public Boolean updateByBo(KnowledgeAttachBo bo) {
+        KnowledgeAttach update = MapstructUtils.convert(bo, KnowledgeAttach.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(KnowledgeAttach entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐭ヨ瘑搴撻檮浠�
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeFragmentServiceImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeFragmentServiceImpl.java
new file mode 100644
index 0000000..2502836
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeFragmentServiceImpl.java
@@ -0,0 +1,113 @@
+package org.ruoyi.service.impl;
+
+import org.ruoyi.common.core.utils.MapstructUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.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.ruoyi.domain.vo.KnowledgeFragmentVo;
+import org.springframework.stereotype.Service;
+import org.ruoyi.domain.bo.KnowledgeFragmentBo;
+import org.ruoyi.domain.KnowledgeFragment;
+import org.ruoyi.mapper.KnowledgeFragmentMapper;
+import org.ruoyi.service.IKnowledgeFragmentService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鐭ヨ瘑鐗囨Service涓氬姟灞傚鐞�
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@RequiredArgsConstructor
+@Service
+public class KnowledgeFragmentServiceImpl implements IKnowledgeFragmentService {
+
+    private final KnowledgeFragmentMapper baseMapper;
+
+    /**
+     * 鏌ヨ鐭ヨ瘑鐗囨
+     */
+    @Override
+    public KnowledgeFragmentVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
+     */
+    @Override
+    public TableDataInfo<KnowledgeFragmentVo> queryPageList(KnowledgeFragmentBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<KnowledgeFragment> lqw = buildQueryWrapper(bo);
+        Page<KnowledgeFragmentVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
+     */
+    @Override
+    public List<KnowledgeFragmentVo> queryList(KnowledgeFragmentBo bo) {
+        LambdaQueryWrapper<KnowledgeFragment> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<KnowledgeFragment> buildQueryWrapper(KnowledgeFragmentBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KnowledgeFragment> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeFragment::getKid, bo.getKid());
+        lqw.eq(StringUtils.isNotBlank(bo.getDocId()), KnowledgeFragment::getDocId, bo.getDocId());
+        lqw.eq(StringUtils.isNotBlank(bo.getFid()), KnowledgeFragment::getFid, bo.getFid());
+        lqw.eq(bo.getIdx() != null, KnowledgeFragment::getIdx, bo.getIdx());
+        lqw.eq(StringUtils.isNotBlank(bo.getContent()), KnowledgeFragment::getContent, bo.getContent());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鐭ヨ瘑鐗囨
+     */
+    @Override
+    public Boolean insertByBo(KnowledgeFragmentBo bo) {
+        KnowledgeFragment add = MapstructUtils.convert(bo, KnowledgeFragment.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鐭ヨ瘑鐗囨
+     */
+    @Override
+    public Boolean updateByBo(KnowledgeFragmentBo bo) {
+        KnowledgeFragment update = MapstructUtils.convert(bo, KnowledgeFragment.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(KnowledgeFragment entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐭ヨ瘑鐗囨
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeInfoServiceImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeInfoServiceImpl.java
new file mode 100644
index 0000000..7acaa09
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeInfoServiceImpl.java
@@ -0,0 +1,120 @@
+package org.ruoyi.service.impl;
+
+import org.ruoyi.common.core.utils.MapstructUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.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.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.springframework.stereotype.Service;
+import org.ruoyi.domain.bo.KnowledgeInfoBo;
+import org.ruoyi.domain.KnowledgeInfo;
+import org.ruoyi.mapper.KnowledgeInfoMapper;
+import org.ruoyi.service.IKnowledgeInfoService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鐭ヨ瘑搴揝ervice涓氬姟灞傚鐞�
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+@RequiredArgsConstructor
+@Service
+public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
+
+    private final KnowledgeInfoMapper baseMapper;
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴�
+     */
+    @Override
+    public KnowledgeInfoVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+     */
+    @Override
+    public TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
+        Page<KnowledgeInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+     */
+    @Override
+    public List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo) {
+        LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<KnowledgeInfo> buildQueryWrapper(KnowledgeInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KnowledgeInfo> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeInfo::getKid, bo.getKid());
+        lqw.eq(bo.getUid() != null, KnowledgeInfo::getUid, bo.getUid());
+        lqw.like(StringUtils.isNotBlank(bo.getKname()), KnowledgeInfo::getKname, bo.getKname());
+        lqw.eq(bo.getShare() != null, KnowledgeInfo::getShare, bo.getShare());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), KnowledgeInfo::getDescription, bo.getDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getKnowledgeSeparator()), KnowledgeInfo::getKnowledgeSeparator, bo.getKnowledgeSeparator());
+        lqw.eq(StringUtils.isNotBlank(bo.getQuestionSeparator()), KnowledgeInfo::getQuestionSeparator, bo.getQuestionSeparator());
+        lqw.eq(bo.getOverlapChar() != null, KnowledgeInfo::getOverlapChar, bo.getOverlapChar());
+        lqw.eq(bo.getRetrieveLimit() != null, KnowledgeInfo::getRetrieveLimit, bo.getRetrieveLimit());
+        lqw.eq(bo.getTextBlockSize() != null, KnowledgeInfo::getTextBlockSize, bo.getTextBlockSize());
+        lqw.eq(StringUtils.isNotBlank(bo.getVector()), KnowledgeInfo::getVector, bo.getVector());
+        lqw.eq(StringUtils.isNotBlank(bo.getVectorModel()), KnowledgeInfo::getVectorModel, bo.getVectorModel());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鐭ヨ瘑搴�
+     */
+    @Override
+    public Boolean insertByBo(KnowledgeInfoBo bo) {
+        KnowledgeInfo add = MapstructUtils.convert(bo, KnowledgeInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鐭ヨ瘑搴�
+     */
+    @Override
+    public Boolean updateByBo(KnowledgeInfoBo bo) {
+        KnowledgeInfo update = MapstructUtils.convert(bo, KnowledgeInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(KnowledgeInfo entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐭ヨ瘑搴�
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysCache.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysCache.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysCache.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysCache.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysConfig.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysConfig.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysConfig.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysConfig.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysDept.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDept.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysDept.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDept.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysDictData.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDictData.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysDictData.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDictData.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysDictType.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDictType.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysDictType.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysDictType.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysLogininfor.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysLogininfor.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysLogininfor.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysLogininfor.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysMenu.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysMenu.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysMenu.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysMenu.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysNotice.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysNotice.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysNotice.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysNotice.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysNoticeState.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysNoticeState.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysNoticeState.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysNoticeState.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysOperLog.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOperLog.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysOperLog.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOperLog.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysOss.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOss.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysOss.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOss.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysOssConfig.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOssConfig.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysOssConfig.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysOssConfig.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysPost.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysPost.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysPost.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysPost.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysRole.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRole.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysRole.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRole.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysRoleDept.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRoleDept.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysRoleDept.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRoleDept.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysRoleMenu.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRoleMenu.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysRoleMenu.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysRoleMenu.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysTenant.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysTenant.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysTenant.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysTenant.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysTenantPackage.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysTenantPackage.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysTenantPackage.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysTenantPackage.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUser.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUser.java
new file mode 100644
index 0000000..f451e98
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUser.java
@@ -0,0 +1,133 @@
+package org.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.ruoyi.common.core.constant.UserConstants;
+import org.ruoyi.common.tenant.core.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 鐢ㄦ埛瀵硅薄 sys_user
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_user")
+public class SysUser extends TenantEntity {
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    @TableId(value = "user_id")
+    private Long userId;
+
+    /**
+     * 閮ㄩ棬ID
+     */
+    private Long deptId;
+
+    /**
+     * 鐢ㄦ埛璐﹀彿
+     */
+    private String userName;
+
+    /**
+     * 鐢ㄦ埛濂楅
+     */
+    private String userPlan;
+
+    /**
+     * 鐢ㄦ埛鏄电О
+     */
+    private String nickName;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷锛坰ys_user绯荤粺鐢ㄦ埛锛�
+     */
+    private String userType;
+
+    /**
+     * 鐢ㄦ埛閭
+     */
+    private String email;
+
+    /**
+     * 鎵嬫満鍙风爜
+     */
+    private String phonenumber;
+
+    /**
+     * 鐢ㄦ埛鎬у埆
+     */
+    private String sex;
+
+    /**
+     * 鐢ㄦ埛澶村儚
+     */
+    private String avatar;
+
+    /**
+     * 瀵嗙爜
+     */
+    @TableField(
+        insertStrategy = FieldStrategy.NOT_EMPTY,
+        updateStrategy = FieldStrategy.NOT_EMPTY,
+        whereStrategy = FieldStrategy.NOT_EMPTY
+    )
+    private String password;
+
+    /**
+     * 甯愬彿鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+    /**
+     * 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 鏈�鍚庣櫥褰旾P
+     */
+    private String loginIp;
+
+    /**
+     * 娉ㄥ唽鍩熷悕
+     */
+    private String domainName;
+
+    /**
+     * 鏈�鍚庣櫥褰曟椂闂�
+     */
+    private Date loginDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /** 鏅�氱敤鎴风殑鏍囪瘑,瀵瑰綋鍓嶅紑鍙戣�呭笎鍙峰敮涓�銆備竴涓猳penid瀵瑰簲涓�涓叕浼楀彿鎴栧皬绋嬪簭 */
+    private String openId;
+
+    /** 鐢ㄦ埛浣欓 */
+    private Double userBalance;
+
+    /** 鐢ㄦ埛绛夌骇 */
+    private String userGrade;
+
+    public SysUser(Long userId) {
+        this.userId = userId;
+    }
+
+    public boolean isSuperAdmin() {
+        return UserConstants.SUPER_ADMIN_ID.equals(this.userId);
+    }
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserOnline.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserOnline.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserOnline.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserOnline.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserPost.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserPost.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserPost.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserPost.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserRole.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserRole.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserRole.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/SysUserRole.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysConfigBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysConfigBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysConfigBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysConfigBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysDeptBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDeptBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysDeptBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDeptBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysDictDataBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDictDataBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysDictDataBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDictDataBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysDictTypeBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDictTypeBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysDictTypeBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysDictTypeBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysLogininforBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysLogininforBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysLogininforBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysLogininforBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysMenuBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysMenuBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysMenuBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysMenuBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysNoticeBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysNoticeBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysNoticeBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysNoticeBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysNoticeStateBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysNoticeStateBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysNoticeStateBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysNoticeStateBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysOperLogBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOperLogBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysOperLogBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOperLogBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysOssBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOssBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysOssBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOssBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysOssConfigBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOssConfigBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysOssConfigBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysOssConfigBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysPostBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysPostBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysPostBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysPostBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysRoleBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysRoleBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysRoleBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysRoleBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysTenantBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysTenantBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysTenantBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysTenantBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysTenantPackageBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysTenantPackageBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysTenantPackageBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysTenantPackageBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserPasswordBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserProfileBo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserProfileBo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/bo/SysUserProfileBo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/EmailRequest.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/EmailRequest.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/EmailRequest.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/EmailRequest.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/OrderRequest.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/OrderRequest.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/OrderRequest.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/OrderRequest.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/UserRequest.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/UserRequest.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/UserRequest.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/request/UserRequest.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/AvatarVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/AvatarVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/AvatarVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/AvatarVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/CacheListInfoVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/CacheListInfoVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/CacheListInfoVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/CacheListInfoVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/CaptchaVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/CaptchaVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/CaptchaVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/CaptchaVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/DeptTreeSelectVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/DeptTreeSelectVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/DeptTreeSelectVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/LoginTenantVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/LoginTenantVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/LoginTenantVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/LoginTenantVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/LoginVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/LoginVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/LoginVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/LoginVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/MenuTreeSelectVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/MenuTreeSelectVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/MenuTreeSelectVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/MetaVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/MetaVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/MetaVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/MetaVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ProfileVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/ProfileVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ProfileVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/ProfileVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/RouterVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/RouterVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/RouterVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/RouterVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysConfigVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysConfigVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysConfigVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysConfigVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysDeptVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDeptVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysDeptVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDeptVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysDictDataVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDictDataVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysDictDataVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDictDataVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDictTypeVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysDictTypeVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysDictTypeVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysLogininforVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysLogininforVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysLogininforVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysLogininforVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysMenuVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysMenuVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysMenuVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysMenuVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysNoticeStateVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeStateVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysNoticeStateVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeStateVo.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java
new file mode 100644
index 0000000..fa279d9
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java
@@ -0,0 +1,55 @@
+package org.ruoyi.system.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.ruoyi.system.domain.SysNotice;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 閫氱煡鍏憡瑙嗗浘瀵硅薄 sys_notice
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@AutoMapper(target = SysNotice.class)
+public class SysNoticeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鍏憡ID
+     */
+    private Long noticeId;
+
+    /**
+     * 鍏憡鏍囬
+     */
+    private String noticeTitle;
+
+    /**
+     * 鍏憡绫诲瀷锛�1閫氱煡 2鍏憡锛�
+     */
+    private String noticeType;
+
+    /**
+     * 鍏憡鍐呭
+     */
+    private String noticeContent;
+
+    /**
+     * 鍏憡鐘舵�侊紙0姝e父 1鍏抽棴锛�
+     */
+    private String status;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOperLogVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOperLogVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOperLogVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOperLogVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOssConfigVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssConfigVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOssConfigVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssConfigVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOssUploadVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssUploadVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOssUploadVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssUploadVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOssVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysOssVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysOssVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysPostVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysPostVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysPostVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysPostVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysRoleVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysRoleVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysRoleVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysRoleVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysTenantPackageVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysTenantPackageVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysTenantPackageVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysTenantVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysTenantVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysTenantVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysTenantVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserExportVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserExportVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserExportVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserExportVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserImportVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserImportVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserImportVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserImportVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserInfoVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserInfoVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserInfoVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserInfoVo.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java
new file mode 100644
index 0000000..8b134b6
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java
@@ -0,0 +1,45 @@
+package org.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆戣鍥惧璞� sys_user_model
+ *
+ * @author Lion Li
+ * @date 2024-08-03
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysUserModel.class)
+public class SysUserModelVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ExcelProperty(value = "id")
+    private Long id;
+
+    /**
+     * 妯″瀷id
+     */
+    @ExcelProperty(value = "妯″瀷id")
+    private Long mid;
+
+    /**
+     * 鐢ㄦ埛缁刬d
+     */
+    @ExcelProperty(value = "鐢ㄦ埛缁刬d")
+    private Long gid;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserOptionVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserOptionVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserOptionVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserOptionVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/SysUserVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/TenantListVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/TenantListVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/TenantListVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/TenantListVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/UserInfoVo.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/UserInfoVo.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/UserInfoVo.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/domain/vo/UserInfoVo.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatAppStoreMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatAppStoreMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatAppStoreMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatAppStoreMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatGptsMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatGptsMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatGptsMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatGptsMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatMessageMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatMessageMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatMessageMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatMessageMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatPluginMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatPluginMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatPluginMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatPluginMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatTokenMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatTokenMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatTokenMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatTokenMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatVisitorUsageMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatVisitorUsageMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatVisitorUsageMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatVisitorUsageMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatVoucherMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatVoucherMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatVoucherMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/ChatVoucherMapper.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverMapper.java
new file mode 100644
index 0000000..08cb737
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverMapper.java
@@ -0,0 +1,14 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+import org.ruoyi.system.domain.vo.cover.CoverVo;
+
+/**
+ * 缈诲敱Mapper鎺ュ彛
+ *
+ * @author NSL
+ * @since 2024-12-25
+ */
+public interface CoverMapper extends BaseMapperPlus<Cover, CoverVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java
new file mode 100644
index 0000000..6abffd9
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java
@@ -0,0 +1,22 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+import org.ruoyi.system.domain.vo.cover.CoverPromptAudioVo;
+
+import java.util.List;
+
+/**
+ * 缈诲敱鐢ㄦ埛鍙傝�冮煶棰慚apper鎺ュ彛
+ *
+ * @author NSL
+ * @since 2024-12-25
+ */
+public interface CoverPromptAudioMapper extends BaseMapperPlus<CoverPromptAudio, CoverPromptAudioVo> {
+
+    /**
+     * 鑾峰彇鏈�杩戜竴娆$炕鍞辫褰�
+     * @param userId 鐢ㄦ埛id
+     * @return 缈诲敱璁板綍
+     */
+    List<CoverPromptAudioVo> selectLatestVoByUserId(Long userId);
+}
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java
new file mode 100644
index 0000000..e854cfc
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鏀粯璁㈠崟Mapper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-04-16
+ */
+public interface PaymentOrdersMapper extends BaseMapperPlus<PaymentOrder, PaymentOrdersVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysConfigMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysConfigMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysConfigMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysConfigMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDeptMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysDeptMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDeptMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDictDataMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysDictDataMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDictDataMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysDictTypeMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDictTypeMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysDictTypeMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysDictTypeMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysLogininforMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysLogininforMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysLogininforMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysLogininforMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysMenuMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysMenuMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysMenuMapper.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java
new file mode 100644
index 0000000..1b436f8
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 绯荤粺妯″瀷Mapper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+public interface SysModelMapper extends BaseMapperPlus<SysModel, SysModelVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysNoticeMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysNoticeMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysNoticeMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysNoticeMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysNoticeStateMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysNoticeStateMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysNoticeStateMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysNoticeStateMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysOperLogMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOperLogMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysOperLogMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOperLogMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysOssConfigMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOssConfigMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysOssConfigMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOssConfigMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysOssMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOssMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysOssMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysOssMapper.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java
new file mode 100644
index 0000000..3a6718a
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 濂楅绠$悊Mapper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-05-05
+ */
+public interface SysPackagePlanMapper extends BaseMapperPlus<SysPackagePlan, SysPackagePlanVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysPostMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPostMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysPostMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysPostMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysRoleDeptMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleDeptMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysRoleDeptMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleDeptMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysRoleMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleMenuMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysRoleMenuMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysRoleMenuMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysTenantMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysTenantMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysTenantMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysTenantMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysTenantPackageMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysTenantPackageMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysTenantPackageMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysTenantPackageMapper.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java
new file mode 100644
index 0000000..8cf0713
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-08-03
+ */
+public interface SysUserGroupMapper extends BaseMapperPlus<SysUserGroup, SysUserGroupVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserMapper.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java
new file mode 100644
index 0000000..e62693e
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java
@@ -0,0 +1,14 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+import org.ruoyi.system.domain.vo.SysUserModelVo;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-08-03
+ */
+public interface SysUserModelMapper extends BaseMapperPlus<SysUserModel, SysUserModelVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserPostMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserPostMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserPostMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserPostMapper.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserRoleMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserRoleMapper.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserRoleMapper.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/SysUserRoleMapper.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java
new file mode 100644
index 0000000..36ad76e
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-05-01
+ */
+public interface WxRobConfigMapper extends BaseMapperPlus<WxRobConfig, WxRobConfigVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java
new file mode 100644
index 0000000..a062dc2
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-05-01
+ */
+public interface WxRobKeywordMapper extends BaseMapperPlus<WxRobKeyword, WxRobKeywordVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java
new file mode 100644
index 0000000..df7d19f
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java
@@ -0,0 +1,13 @@
+package org.ruoyi.system.mapper;
+
+import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2024-05-01
+ */
+public interface WxRobRelationMapper extends BaseMapperPlus<WxRobRelation, WxRobRelationVo> {
+
+}
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java
new file mode 100644
index 0000000..2b531ad
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java
@@ -0,0 +1,28 @@
+package org.ruoyi.system.runner;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.system.service.ISysOssConfigService;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鍒濆鍖� system 妯″潡瀵瑰簲涓氬姟鏁版嵁
+ *
+ * @author Lion Li
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Component
+public class SystemApplicationRunner implements ApplicationRunner {
+
+    private final ISysOssConfigService ossConfigService;
+
+    @Override
+    public void run(ApplicationArguments args) {
+        ossConfigService.init();
+        log.info("鍒濆鍖朞SS閰嶇疆鎴愬姛");
+    }
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysConfigService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysConfigService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysConfigService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysConfigService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDataScopeService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDataScopeService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDataScopeService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDataScopeService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDeptService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDeptService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDeptService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDeptService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDictDataService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDictDataService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDictDataService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDictDataService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDictTypeService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDictTypeService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysDictTypeService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysDictTypeService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysLogininforService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysLogininforService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysLogininforService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysLogininforService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysMenuService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysMenuService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysMenuService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysMenuService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysNoticeService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysNoticeService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysNoticeService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysNoticeService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysNoticeStateService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysNoticeStateService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysNoticeStateService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysNoticeStateService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysOperLogService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOperLogService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysOperLogService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOperLogService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysOssConfigService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOssConfigService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysOssConfigService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOssConfigService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysOssService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOssService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysOssService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysOssService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPermissionService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysPermissionService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPermissionService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysPermissionService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPostService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysPostService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPostService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysPostService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysRoleService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysRoleService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysRoleService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysRoleService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysTenantPackageService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysTenantPackageService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysTenantPackageService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysTenantPackageService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysTenantService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysTenantService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysTenantService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysTenantService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysUserService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/ISysUserService.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysLoginService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysLoginService.java
new file mode 100644
index 0000000..5ab1195
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysLoginService.java
@@ -0,0 +1,433 @@
+package org.ruoyi.system.service;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.secure.BCrypt;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.ruoyi.common.core.constant.Constants;
+import org.ruoyi.common.core.constant.GlobalConstants;
+import org.ruoyi.common.core.constant.TenantConstants;
+import org.ruoyi.common.core.domain.dto.RoleDTO;
+import org.ruoyi.common.core.domain.model.LoginUser;
+import org.ruoyi.common.core.domain.model.VisitorLoginBody;
+import org.ruoyi.common.core.domain.model.VisitorLoginUser;
+import org.ruoyi.common.core.enums.*;
+import org.ruoyi.common.core.exception.user.CaptchaException;
+import org.ruoyi.common.core.exception.user.CaptchaExpireException;
+import org.ruoyi.common.core.exception.user.UserException;
+import org.ruoyi.common.core.service.ConfigService;
+import org.ruoyi.common.core.utils.*;
+import org.ruoyi.common.log.event.LogininforEvent;
+import org.ruoyi.common.redis.utils.RedisUtils;
+import org.ruoyi.common.satoken.utils.LoginHelper;
+import org.ruoyi.common.tenant.exception.TenantException;
+import org.ruoyi.common.tenant.helper.TenantHelper;
+import org.ruoyi.system.domain.SysUser;
+import org.ruoyi.system.domain.bo.SysUserBo;
+import org.ruoyi.system.domain.vo.LoginVo;
+import org.ruoyi.system.domain.vo.SysTenantVo;
+import org.ruoyi.system.domain.vo.SysUserVo;
+import org.ruoyi.system.mapper.SysUserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.Duration;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.function.Supplier;
+
+/**
+ * 鐧诲綍鏍¢獙鏂规硶
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Service
+public class SysLoginService {
+
+    private final SysUserMapper userMapper;
+    private final ISysPermissionService permissionService;
+    private final ISysTenantService tenantService;
+    private final WxMaService wxMaService;
+    private final ISysUserService userService;
+    private final ConfigService configService;
+    @Value("${user.password.maxRetryCount}")
+    private Integer maxRetryCount;
+
+    @Value("${user.password.lockTime}")
+    private Integer lockTime;
+
+    /**
+     * 鑾峰彇寰俊
+     * @param xcxCode 鑾峰彇xcxCode
+    */
+    public String getOpenidFromCode(String xcxCode) {
+        try {
+            WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(xcxCode);
+            return sessionInfo.getOpenid();
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    /**
+     * 鐧诲綍楠岃瘉
+     *
+     * @param username 鐢ㄦ埛鍚�
+     * @param password 瀵嗙爜
+     * @param code     楠岃瘉鐮�
+     * @param uuid     鍞竴鏍囪瘑
+     * @return 缁撴灉
+     */
+    public String login(String tenantId, String username, String password, String code, String uuid) {
+        SysUserVo user = loadUserByUsername(tenantId, username);
+        checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
+        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
+        LoginUser loginUser = buildLoginUser(user);
+        // 鐢熸垚token
+        LoginHelper.loginByDevice(loginUser, DeviceType.PC);
+
+        recordLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        recordLoginInfo(user.getUserId());
+        return StpUtil.getTokenValue();
+    }
+
+    public String smsLogin(String tenantId, String phonenumber, String smsCode) {
+        // 鏍¢獙绉熸埛
+        checkTenant(tenantId);
+        // 閫氳繃鎵嬫満鍙锋煡鎵剧敤鎴�
+        SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
+
+        checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
+        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
+        LoginUser loginUser = buildLoginUser(user);
+        // 鐢熸垚token
+        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
+
+        recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        recordLoginInfo(user.getUserId());
+        return StpUtil.getTokenValue();
+    }
+
+    public String emailLogin(String tenantId, String email, String emailCode) {
+        // 鏍¢獙绉熸埛
+        checkTenant(tenantId);
+        // 閫氳繃鎵嬫満鍙锋煡鎵剧敤鎴�
+        SysUserVo user = loadUserByEmail(tenantId, email);
+
+        checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
+        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
+        LoginUser loginUser = buildLoginUser(user);
+        // 鐢熸垚token
+        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
+
+        recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        recordLoginInfo(user.getUserId());
+        return StpUtil.getTokenValue();
+    }
+
+
+    /**
+     * 娓稿鐧诲綍
+     *
+     * @param loginBody
+     * @return String
+     * @Date 2023/5/18
+     **/
+    public void visitorLogin(VisitorLoginBody loginBody) {
+        String openid = "";
+        // PC绔父瀹㈢櫥褰�
+        if (LoginUserType.PC.getCode().equals(loginBody.getType())) {
+            openid = loginBody.getCode();
+        } else {
+            // 灏忕▼搴忓尶鍚嶇櫥褰�
+            try {
+                WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(loginBody.getCode());
+                openid = session.getOpenid();
+            } catch (WxErrorException e) {
+                log.error(e.getMessage(), e);
+            } finally {
+                // 娓呯悊ThreadLocal
+                WxMaConfigHolder.remove();
+            }
+        }
+    }
+
+    public LoginVo mpLogin(String openid) {
+        // 浣跨敤 openid 鏌ヨ缁戝畾鐢ㄦ埛 濡傛湭缁戝畾鐢ㄦ埛 鍒欐牴鎹笟鍔¤嚜琛屽鐞� 渚嬪 鍒涘缓榛樿鐢ㄦ埛
+        SysUserVo user = userService.selectUserByOpenId(openid);
+        VisitorLoginUser loginUser = new VisitorLoginUser();
+        if (ObjectUtil.isNull(user)) {
+            SysUserBo sysUser = new SysUserBo();
+            // 鏀逛负鑷
+            String name = "鐢ㄦ埛" + UUID.randomUUID().toString().replace("-", "");
+            // 璁剧疆榛樿鐢ㄦ埛鍚�
+            sysUser.setUserName(name);
+            // 璁剧疆榛樿鏄电О
+            sysUser.setNickName(name);
+            // 璁剧疆榛樿瀵嗙爜
+            sysUser.setPassword(BCrypt.hashpw("123456"));
+            // 璁剧疆寰俊openId
+            sysUser.setOpenId(openid);
+            String configValue = configService.getConfigValue("mail", "amount");
+            // 璁剧疆榛樿浣欓
+            sysUser.setUserBalance(NumberUtils.toDouble(configValue, 1));
+            // 娉ㄥ唽鐢ㄦ埛,璁剧疆榛樿绉熸埛涓�0
+            SysUser registerUser = userService.registerUser(sysUser, "0");
+
+            // 鏋勫缓鐧诲綍鐢ㄦ埛淇℃伅
+            loginUser.setTenantId("0");
+            loginUser.setUserId(registerUser.getUserId());
+            loginUser.setUsername(registerUser.getUserName());
+            loginUser.setUserType(UserType.APP_USER.getUserType());
+            loginUser.setOpenid(openid);
+            loginUser.setNickName(registerUser.getNickName());
+
+        } else {
+            // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
+            loginUser.setTenantId(user.getTenantId());
+            loginUser.setUserId(user.getUserId());
+            loginUser.setUsername(user.getUserName());
+            loginUser.setUserType(user.getUserType());
+            loginUser.setNickName(user.getNickName());
+            loginUser.setAvatar(user.getWxAvatar());
+            loginUser.setOpenid(openid);
+        }
+        // 鐢熸垚token
+        LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
+        recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        LoginVo loginVo = new LoginVo();
+        // 鐢熸垚浠ょ墝
+        loginVo.setToken(StpUtil.getTokenValue());
+        loginVo.setUserInfo(loginUser);
+        return loginVo;
+    }
+
+
+    /**
+     * 閫�鍑虹櫥褰�
+     */
+    public void logout() {
+        try {
+            LoginUser loginUser = LoginHelper.getLoginUser();
+            if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) {
+                // 瓒呯骇绠$悊鍛� 鐧诲嚭娓呴櫎鍔ㄦ�佺鎴�
+                TenantHelper.clearDynamic();
+            }
+            StpUtil.logout();
+            if (loginUser !=null) {
+                recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
+            }
+        } catch (NotLoginException ignored) {
+        }
+    }
+
+    /**
+     * 璁板綍鐧诲綍淇℃伅
+     *
+     * @param tenantId 绉熸埛ID
+     * @param username 鐢ㄦ埛鍚�
+     * @param status   鐘舵��
+     * @param message  娑堟伅鍐呭
+     */
+    private void recordLogininfor(String tenantId, String username, String status, String message) {
+        LogininforEvent logininforEvent = new LogininforEvent();
+        logininforEvent.setTenantId(tenantId);
+        logininforEvent.setUsername(username);
+        logininforEvent.setStatus(status);
+        logininforEvent.setMessage(message);
+        logininforEvent.setRequest(ServletUtils.getRequest());
+        SpringUtils.context().publishEvent(logininforEvent);
+    }
+
+    /**
+     * 鏍¢獙鐭俊楠岃瘉鐮�
+     */
+    private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
+        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
+        if (StringUtils.isBlank(code)) {
+            recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        return code.equals(smsCode);
+    }
+
+    /**
+     * 鏍¢獙閭楠岃瘉鐮�
+     */
+    private boolean validateEmailCode(String tenantId, String email, String emailCode) {
+        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
+        if (StringUtils.isBlank(code)) {
+            recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        return code.equals(emailCode);
+    }
+
+    /**
+     * 鏍¢獙楠岃瘉鐮�
+     *
+     * @param username 鐢ㄦ埛鍚�
+     * @param code     楠岃瘉鐮�
+     * @param uuid     鍞竴鏍囪瘑
+     */
+    public void validateCaptcha(String tenantId, String username, String code, String uuid) {
+        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
+        String captcha = RedisUtils.getCacheObject(verifyKey);
+        RedisUtils.deleteObject(verifyKey);
+        if (captcha == null) {
+            recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        if (!code.equalsIgnoreCase(captcha)) {
+            recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
+            throw new CaptchaException();
+        }
+    }
+
+    private SysUserVo loadUserByUsername(String tenantId, String username) {
+
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().select(SysUser::getUserName, SysUser::getStatus).eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId).eq(SysUser::getUserName, username));
+        if (ObjectUtil.isNull(user)) {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
+            throw new UserException("user.not.exists", username);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
+            throw new UserException("user.blocked", username);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByUserName(username, tenantId);
+        }
+        return userMapper.selectUserByUserName(username);
+    }
+
+    private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().select(SysUser::getPhonenumber, SysUser::getStatus).eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId).eq(SysUser::getPhonenumber, phonenumber));
+        if (ObjectUtil.isNull(user)) {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", phonenumber);
+            throw new UserException("user.not.exists", phonenumber);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", phonenumber);
+            throw new UserException("user.blocked", phonenumber);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByPhonenumber(phonenumber, tenantId);
+        }
+        return userMapper.selectUserByPhonenumber(phonenumber);
+    }
+
+    private SysUserVo loadUserByEmail(String tenantId, String email) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().select(SysUser::getPhonenumber, SysUser::getStatus).eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId).eq(SysUser::getEmail, email));
+        if (ObjectUtil.isNull(user)) {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", email);
+            throw new UserException("user.not.exists", email);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", email);
+            throw new UserException("user.blocked", email);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByEmail(email, tenantId);
+        }
+        return userMapper.selectUserByEmail(email);
+    }
+
+    /**
+     * 鏋勫缓鐧诲綍鐢ㄦ埛
+     */
+    private LoginUser buildLoginUser(SysUserVo user) {
+        LoginUser loginUser = new LoginUser();
+        loginUser.setTenantId(user.getTenantId());
+        loginUser.setUserId(user.getUserId());
+        loginUser.setDeptId(user.getDeptId());
+        loginUser.setUsername(user.getUserName());
+        loginUser.setAvatar(user.getAvatar());
+        loginUser.setUserType(user.getUserType());
+        loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
+        loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
+        loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
+        List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
+        loginUser.setRoles(roles);
+        return loginUser;
+    }
+
+    /**
+     * 璁板綍鐧诲綍淇℃伅
+     *
+     * @param userId 鐢ㄦ埛ID
+     */
+    public void recordLoginInfo(Long userId) {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(userId);
+        sysUser.setLoginIp(ServletUtils.getClientIP());
+        sysUser.setLoginDate(DateUtils.getNowDate());
+        sysUser.setUpdateBy(userId);
+        userMapper.updateById(sysUser);
+    }
+
+    /**
+     * 鐧诲綍鏍¢獙
+     */
+    private void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
+        String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
+        String loginFail = Constants.LOGIN_FAIL;
+
+        // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟(鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip)
+        Integer errorNumber = RedisUtils.getCacheObject(errorKey);
+        // 閿佸畾鏃堕棿鍐呯櫥褰� 鍒欒涪鍑�
+        if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
+            recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
+            throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
+        }
+
+        if (supplier.get()) {
+            // 鏄惁绗竴娆�
+            errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
+            // 杈惧埌瑙勫畾閿欒娆℃暟 鍒欓攣瀹氱櫥褰�
+            if (errorNumber.equals(maxRetryCount)) {
+                RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
+                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
+                throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
+            } else {
+                // 鏈揪鍒拌瀹氶敊璇鏁� 鍒欓�掑
+                RedisUtils.setCacheObject(errorKey, errorNumber);
+                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
+                throw new UserException(loginType.getRetryLimitCount(), errorNumber);
+            }
+        }
+
+        // 鐧诲綍鎴愬姛 娓呯┖閿欒娆℃暟
+        RedisUtils.deleteObject(errorKey);
+    }
+
+    private void checkTenant(String tenantId) {
+        if (!TenantHelper.isEnable()) {
+            return;
+        }
+        if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
+            return;
+        }
+        SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
+        if (ObjectUtil.isNull(tenant)) {
+            log.info("鐧诲綍绉熸埛锛歿} 涓嶅瓨鍦�.", tenantId);
+            throw new TenantException("tenant.not.exists");
+        } else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) {
+            log.info("鐧诲綍绉熸埛锛歿} 宸茶鍋滅敤.", tenantId);
+            throw new TenantException("tenant.blocked");
+        } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) && new Date().after(tenant.getExpireTime())) {
+            log.info("鐧诲綍绉熸埛锛歿} 宸茶秴杩囨湁鏁堟湡.", tenantId);
+            throw new TenantException("tenant.expired");
+        }
+    }
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/SysRegisterService.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysRegisterService.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/SysRegisterService.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/SysRegisterService.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDataScopeServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDataScopeServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDataScopeServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDeptServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDeptServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDeptServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDictDataServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDictDataServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDictDataServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysLogininforServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysLogininforServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysLogininforServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysMenuServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysMenuServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysMenuServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysNoticeServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysNoticeServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysNoticeServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysNoticeStateServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysNoticeStateServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysNoticeStateServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysNoticeStateServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOperLogServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysOperLogServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOperLogServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOssConfigServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysOssConfigServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOssConfigServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOssServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysOssServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysOssServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysPermissionServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPermissionServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysPermissionServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysPostServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPostServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysPostServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysRoleServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysRoleServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysRoleServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysSensitiveServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysSensitiveServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysSensitiveServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysTenantServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysTenantServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysTenantServiceImpl.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java
new file mode 100644
index 0000000..c3a9094
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java
@@ -0,0 +1,106 @@
+package org.ruoyi.system.service.impl;
+
+import org.ruoyi.common.core.utils.MapstructUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.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.ruoyi.system.mapper.SysUserGroupMapper;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
+ *
+ * @author Lion Li
+ * @date 2024-08-03
+ */
+@RequiredArgsConstructor
+@Service
+public class SysUserGroupServiceImpl implements ISysUserGroupService {
+
+    private final SysUserGroupMapper baseMapper;
+
+    /**
+     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @Override
+    public SysUserGroupVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+     */
+    @Override
+    public TableDataInfo<SysUserGroupVo> queryPageList(SysUserGroupBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysUserGroup> lqw = buildQueryWrapper(bo);
+        Page<SysUserGroupVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+     */
+    @Override
+    public List<SysUserGroupVo> queryList(SysUserGroupBo bo) {
+        LambdaQueryWrapper<SysUserGroup> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysUserGroup> buildQueryWrapper(SysUserGroupBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysUserGroup> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getGroupName()), SysUserGroup::getGroupName, bo.getGroupName());
+        lqw.eq(StringUtils.isNotBlank(bo.getUpdateIp()), SysUserGroup::getUpdateIp, bo.getUpdateIp());
+        return lqw;
+    }
+
+    /**
+     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @Override
+    public Boolean insertByBo(SysUserGroupBo bo) {
+        SysUserGroup add = MapstructUtils.convert(bo, SysUserGroup.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @Override
+    public Boolean updateByBo(SysUserGroupBo bo) {
+        SysUserGroup update = MapstructUtils.convert(bo, SysUserGroup.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(SysUserGroup entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserServiceImpl.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserServiceImpl.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/SysUserServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/AesUtils.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/AesUtils.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/AesUtils.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/AesUtils.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/AudioOkHttpUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/AudioOkHttpUtil.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/AudioOkHttpUtil.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/AudioOkHttpUtil.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/DesensitizationUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/DesensitizationUtil.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/DesensitizationUtil.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/DesensitizationUtil.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/HttpUtils.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/HttpUtils.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/HttpUtils.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/HttpUtils.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/KeyUtils.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/KeyUtils.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/KeyUtils.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/KeyUtils.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/OrderNumberGenerator.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/OrderNumberGenerator.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/OrderNumberGenerator.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/OrderNumberGenerator.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WddPptApi.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WddPptApi.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WddPptApi.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WddPptApi.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeChatScanHttpUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeChatScanHttpUtil.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeChatScanHttpUtil.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeChatScanHttpUtil.java
diff --git a/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java
new file mode 100644
index 0000000..56fbd19
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java
@@ -0,0 +1,81 @@
+package org.ruoyi.system.util;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.common.core.service.ConfigService;
+import org.ruoyi.system.domain.model.WeixinQrCode;
+import org.springframework.stereotype.Component;
+
+import java.net.URI;
+import java.time.LocalDateTime;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class WeixinApiUtil {
+
+    private final ConfigService configService;
+
+    private static String QR_CODE_URL_PREFIX = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";
+
+    private static String ACCESS_TOKEN = null;
+    private static LocalDateTime ACCESS_TOKEN_EXPIRE_TIME = null;
+    /**
+     * 浜岀淮鐮� Ticket 杩囨湡鏃堕棿
+     */
+    private static int QR_CODE_TICKET_TIMEOUT = 10 * 60;
+
+    /**
+     * 鑾峰彇 access token
+     *
+     * @return
+     */
+    public synchronized String getAccessToken() {
+        if (ACCESS_TOKEN != null && ACCESS_TOKEN_EXPIRE_TIME.isAfter(LocalDateTime.now())) {
+            return ACCESS_TOKEN;
+        }
+        String api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + getKey("appid") + "&secret="
+            + getKey("secret");
+        String result = HttpUtil.get(api);
+        JSONObject jsonObject = JSON.parseObject(result);
+        ACCESS_TOKEN = jsonObject.getString("access_token");
+        ACCESS_TOKEN_EXPIRE_TIME = LocalDateTime.now().plusSeconds(jsonObject.getLong("expires_in") - 10);
+        return ACCESS_TOKEN;
+    }
+
+    /**
+     * 鑾峰彇浜岀淮鐮� Ticket
+     *
+     * https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html
+     *
+     * @return
+     */
+    public WeixinQrCode getQrCode() {
+        String api = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + getAccessToken();
+        String jsonBody = String.format("{\n"
+            + "  \"expire_seconds\": %d,\n"
+            + "  \"action_name\": \"QR_STR_SCENE\",\n"
+            + "  \"action_info\": {\n"
+            + "    \"scene\": {\n"
+            + "      \"scene_str\": \"%s\"\n"
+            + "    }\n"
+            + "  }\n"
+            + "}", QR_CODE_TICKET_TIMEOUT, KeyUtils.uuid32());
+        String result = HttpUtil.post(api, jsonBody);
+        log.info("get qr code params:{}", jsonBody);
+        log.info("get qr code result:{}", result);
+        WeixinQrCode weixinQrCode = JSON.parseObject(result, WeixinQrCode.class);
+        weixinQrCode.setQrCodeUrl(QR_CODE_URL_PREFIX + URI.create(weixinQrCode.getTicket()).toASCIIString());
+        return weixinQrCode;
+    }
+
+    public String getKey(String key) {
+        return configService.getConfigValue("weixin", key);
+    }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinMsgUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinMsgUtil.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinMsgUtil.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinMsgUtil.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinQrCodeCacheUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinQrCodeCacheUtil.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinQrCodeCacheUtil.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/WeixinQrCodeCacheUtil.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/XmlUtil.java b/ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/XmlUtil.java
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/XmlUtil.java
rename to ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/util/XmlUtil.java
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CoverMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/CoverMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CoverMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/CoverMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CoverPromptAudioMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/CoverPromptAudioMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CoverPromptAudioMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/CoverPromptAudioMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/PaymentOrdersMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/PaymentOrdersMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/PaymentOrdersMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/PaymentOrdersMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysConfigMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysConfigMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDeptMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDeptMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDictDataMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDictDataMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDictTypeMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysDictTypeMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysLogininforMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysLogininforMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysMenuMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysMenuMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysModelMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysModelMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysModelMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysModelMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysNoticeMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysNoticeMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeStateMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysNoticeStateMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeStateMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysNoticeStateMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOperLogMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOperLogMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOssConfigMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssConfigMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOssConfigMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOssMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysOssMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPackagePlanMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysPackagePlanMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPackagePlanMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysPackagePlanMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysPostMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysPostMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleDeptMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleDeptMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleMenuMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysRoleMenuMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysTenantMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysTenantMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysTenantPackageMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysTenantPackageMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserPostMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserPostMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserRoleMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/SysUserRoleMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/WxRobConfigMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobConfigMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/WxRobConfigMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobConfigMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/WxRobKeywordMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobKeywordMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/WxRobKeywordMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobKeywordMapper.xml
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/WxRobRelationMapper.xml b/ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobRelationMapper.xml
similarity index 100%
rename from ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/WxRobRelationMapper.xml
rename to ruoyi-modules-api/ruoyi-system-api/src/main/resources/mapper/WxRobRelationMapper.xml
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index ac97241..20c5419 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -20,7 +20,6 @@
         <module>ruoyi-demo</module>
         <module>ruoyi-chat</module>
         <module>ruoyi-system</module>
-        <module>ruoyi-knowledge</module>
         <module>ruoyi-generator</module>
     </modules>
 
diff --git a/ruoyi-modules/ruoyi-chat/pom.xml b/ruoyi-modules/ruoyi-chat/pom.xml
index b6a9d82..9f25428 100644
--- a/ruoyi-modules/ruoyi-chat/pom.xml
+++ b/ruoyi-modules/ruoyi-chat/pom.xml
@@ -107,13 +107,27 @@
             <groupId>jakarta.servlet</groupId>
             <artifactId>jakarta.servlet-api</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-system</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.ruoyi</groupId>
-            <artifactId>ruoyi-knowledge</artifactId>
+            <artifactId>ruoyi-knowledge-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-chat-api</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.26</version>
+            <scope>compile</scope>
         </dependency>
     </dependencies>
 
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/ChatController.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/ChatController.java
index e6a4446..4d5f9fa 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/ChatController.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/ChatController.java
@@ -5,11 +5,12 @@
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chat.service.chat.ISseService;
 import org.ruoyi.common.chat.domain.request.ChatRequest;
-import org.ruoyi.common.chat.domain.request.Dall3Request;
+
 import org.ruoyi.common.chat.entity.Tts.TextToSpeech;
 import org.ruoyi.common.chat.entity.files.UploadFileResponse;
-import org.ruoyi.common.chat.entity.images.Item;
+
 import org.ruoyi.common.chat.entity.whisper.WhisperResponse;
 import org.ruoyi.common.core.domain.R;
 import org.ruoyi.common.core.domain.model.LoginUser;
@@ -17,8 +18,10 @@
 import org.ruoyi.common.mybatis.core.page.PageQuery;
 import org.ruoyi.common.mybatis.core.page.TableDataInfo;
 import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.system.domain.request.translation.TranslationRequest;
-import org.ruoyi.system.service.ISseService;
+import org.ruoyi.domain.bo.ChatMessageBo;
+
+import org.ruoyi.domain.vo.ChatMessageVo;
+import org.ruoyi.service.IChatMessageService;
 import org.springframework.core.io.Resource;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
@@ -26,7 +29,6 @@
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
-import java.util.List;
 
 /**
  * 鎻忚堪锛氳亰澶╃鐞�
@@ -55,7 +57,6 @@
         }
         return sseService.sseChat(chatRequest,request);
     }
-
 
     /**
      * 涓婁紶鏂囦欢
@@ -90,22 +91,6 @@
         return sseService.textToSpeed(textToSpeech);
     }
 
-    /**
-     * 鏂囨湰缈昏瘧
-     *
-     * @param
-     */
-    @PostMapping("/translation")
-    @ResponseBody
-    public String translation(@RequestBody TranslationRequest translationRequest) {
-        return sseService.translation(translationRequest);
-    }
-
-    @PostMapping("/dall3")
-    @ResponseBody
-    public R<List<Item>> dall3(@RequestBody @Valid Dall3Request request) {
-        return R.ok(sseService.dall3(request));
-    }
 
     /**
      * 鑱婂ぉ璁板綍
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/SubmitController.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/SubmitController.java
index a5e9208..11fd751 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/SubmitController.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/SubmitController.java
@@ -7,7 +7,7 @@
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.Request;
 import org.apache.commons.lang3.math.NumberUtils;
-import org.ruoyi.chat.dto.*;
+import org.ruoyi.chat.domain.dto.*;
 import org.ruoyi.chat.enums.ActionType;
 import org.ruoyi.chat.util.MjOkHttpUtil;
 import org.springframework.web.bind.annotation.PostMapping;
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/TaskController.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/TaskController.java
index 481b5b3..ea86a2a 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/TaskController.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/TaskController.java
@@ -7,7 +7,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.Request;
-import org.ruoyi.chat.dto.TaskConditionDTO;
+import org.ruoyi.chat.domain.dto.TaskConditionDTO;
 import org.ruoyi.chat.util.MjOkHttpUtil;
 import org.springframework.web.bind.annotation.*;
 
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/BaseSubmitDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/BaseSubmitDTO.java
new file mode 100644
index 0000000..0c2334f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/BaseSubmitDTO.java
@@ -0,0 +1,16 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public abstract class BaseSubmitDTO {
+
+	@ApiModelProperty("鑷畾涔夊弬鏁�")
+	protected String state;
+
+	@ApiModelProperty("鍥炶皟鍦板潃, 涓虹┖鏃朵娇鐢ㄥ叏灞�notifyHook")
+	protected String notifyHook;
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitActionDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitActionDTO.java
new file mode 100644
index 0000000..49da1da
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitActionDTO.java
@@ -0,0 +1,18 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+
+@Data
+@ApiModel("鍙樺寲浠诲姟鎻愪氦鍙傛暟")
+public class SubmitActionDTO {
+
+	private String customId;
+
+	private String taskId;
+
+    private String state;
+
+    private String notifyHook;
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitBlendDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitBlendDTO.java
new file mode 100644
index 0000000..3c3d8cc
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitBlendDTO.java
@@ -0,0 +1,21 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.chat.enums.BlendDimensions;
+
+import java.util.List;
+
+@Data
+@ApiModel("Blend鎻愪氦鍙傛暟")
+@EqualsAndHashCode(callSuper = true)
+public class SubmitBlendDTO extends BaseSubmitDTO {
+
+	@ApiModelProperty(value = "鍥剧墖base64鏁扮粍", required = true, example = "[\"data:image/png;base64,xxx1\", \"data:image/png;base64,xxx2\"]")
+	private List<String> base64Array;
+
+	@ApiModelProperty(value = "姣斾緥: PORTRAIT(2:3); SQUARE(1:1); LANDSCAPE(3:2)", example = "SQUARE")
+	private BlendDimensions dimensions = BlendDimensions.SQUARE;
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitChangeDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitChangeDTO.java
new file mode 100644
index 0000000..039e15f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitChangeDTO.java
@@ -0,0 +1,25 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.ruoyi.chat.enums.TaskAction;
+
+
+@Data
+@ApiModel("鍙樺寲浠诲姟鎻愪氦鍙傛暟")
+@EqualsAndHashCode(callSuper = true)
+public class SubmitChangeDTO extends BaseSubmitDTO {
+
+	@ApiModelProperty(value = "浠诲姟ID", required = true, example = "\"1320098173412546\"")
+	private String taskId;
+
+	@ApiModelProperty(value = "UPSCALE(鏀惧ぇ); VARIATION(鍙樻崲); REROLL(閲嶆柊鐢熸垚)", required = true,
+			allowableValues = "UPSCALE, VARIATION, REROLL", example = "UPSCALE")
+	private TaskAction action;
+
+	@ApiModelProperty(value = "搴忓彿(1~4), action涓篣PSCALE,VARIATION鏃跺繀浼�", allowableValues = "range[1, 4]", example = "1")
+	private Integer index;
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitDescribeDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitDescribeDTO.java
new file mode 100644
index 0000000..3be051e
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitDescribeDTO.java
@@ -0,0 +1,15 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@ApiModel("Describe鎻愪氦鍙傛暟")
+@EqualsAndHashCode(callSuper = true)
+public class SubmitDescribeDTO extends BaseSubmitDTO {
+
+	@ApiModelProperty(value = "鍥剧墖base64", required = true, example = "data:image/png;base64,xxx")
+	private String base64;
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitImagineDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitImagineDTO.java
new file mode 100644
index 0000000..d65a0db
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitImagineDTO.java
@@ -0,0 +1,26 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+
+@Data
+@ApiModel("Imagine鎻愪氦鍙傛暟")
+@EqualsAndHashCode(callSuper = true)
+public class SubmitImagineDTO extends BaseSubmitDTO {
+
+	@ApiModelProperty(value = "鎻愮ず璇�", required = true, example = "Cat")
+	private String prompt;
+
+	@ApiModelProperty(value = "鍨浘base64鏁扮粍")
+	private List<String> base64Array;
+
+	@ApiModelProperty(hidden = true)
+	@Deprecated(since = "3.0", forRemoval = true)
+	private String base64;
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitModalDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitModalDTO.java
new file mode 100644
index 0000000..4a321e4
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitModalDTO.java
@@ -0,0 +1,19 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("灞�閮ㄩ噸缁樻彁浜ゅ弬鏁�")
+public class SubmitModalDTO extends BaseSubmitDTO{
+
+	private String maskBase64;
+
+	private String taskId;
+
+    private String prompt;
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitShortenDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitShortenDTO.java
new file mode 100644
index 0000000..f8f7ed3
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitShortenDTO.java
@@ -0,0 +1,17 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("prompt鍒嗘瀽鎻愪氦鍙傛暟")
+public class SubmitShortenDTO extends BaseSubmitDTO{
+
+	private String botType;
+
+    private String prompt;
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitSimpleChangeDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitSimpleChangeDTO.java
new file mode 100644
index 0000000..b4e09a0
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/SubmitSimpleChangeDTO.java
@@ -0,0 +1,17 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@Data
+@ApiModel("鍙樺寲浠诲姟鎻愪氦鍙傛暟-simple")
+@EqualsAndHashCode(callSuper = true)
+public class SubmitSimpleChangeDTO extends BaseSubmitDTO {
+
+	@ApiModelProperty(value = "鍙樺寲鎻忚堪: ID $action$index", required = true, example = "1320098173412546 U2")
+	private String content;
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/TaskConditionDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/TaskConditionDTO.java
new file mode 100644
index 0000000..46864ce
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/domain/dto/TaskConditionDTO.java
@@ -0,0 +1,14 @@
+package org.ruoyi.chat.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("浠诲姟鏌ヨ鍙傛暟")
+public class TaskConditionDTO {
+
+	private List<String> ids;
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/BaseSubmitDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/BaseSubmitDTO.java
deleted file mode 100644
index 318fd13..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/BaseSubmitDTO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public abstract class BaseSubmitDTO {
-
-	@ApiModelProperty("鑷畾涔夊弬鏁�")
-	protected String state;
-
-	@ApiModelProperty("鍥炶皟鍦板潃, 涓虹┖鏃朵娇鐢ㄥ叏灞�notifyHook")
-	protected String notifyHook;
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitActionDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitActionDTO.java
deleted file mode 100644
index c450169..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitActionDTO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-
-
-@Data
-@ApiModel("鍙樺寲浠诲姟鎻愪氦鍙傛暟")
-public class SubmitActionDTO {
-
-	private String customId;
-
-	private String taskId;
-
-    private String state;
-
-    private String notifyHook;
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitBlendDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitBlendDTO.java
deleted file mode 100644
index 4e11dfe..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitBlendDTO.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.chat.enums.BlendDimensions;
-
-import java.util.List;
-
-@Data
-@ApiModel("Blend鎻愪氦鍙傛暟")
-@EqualsAndHashCode(callSuper = true)
-public class SubmitBlendDTO extends BaseSubmitDTO {
-
-	@ApiModelProperty(value = "鍥剧墖base64鏁扮粍", required = true, example = "[\"data:image/png;base64,xxx1\", \"data:image/png;base64,xxx2\"]")
-	private List<String> base64Array;
-
-	@ApiModelProperty(value = "姣斾緥: PORTRAIT(2:3); SQUARE(1:1); LANDSCAPE(3:2)", example = "SQUARE")
-	private BlendDimensions dimensions = BlendDimensions.SQUARE;
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitChangeDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitChangeDTO.java
deleted file mode 100644
index 80e4245..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitChangeDTO.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.chat.enums.TaskAction;
-
-
-@Data
-@ApiModel("鍙樺寲浠诲姟鎻愪氦鍙傛暟")
-@EqualsAndHashCode(callSuper = true)
-public class SubmitChangeDTO extends BaseSubmitDTO {
-
-	@ApiModelProperty(value = "浠诲姟ID", required = true, example = "\"1320098173412546\"")
-	private String taskId;
-
-	@ApiModelProperty(value = "UPSCALE(鏀惧ぇ); VARIATION(鍙樻崲); REROLL(閲嶆柊鐢熸垚)", required = true,
-			allowableValues = "UPSCALE, VARIATION, REROLL", example = "UPSCALE")
-	private TaskAction action;
-
-	@ApiModelProperty(value = "搴忓彿(1~4), action涓篣PSCALE,VARIATION鏃跺繀浼�", allowableValues = "range[1, 4]", example = "1")
-	private Integer index;
-
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitDescribeDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitDescribeDTO.java
deleted file mode 100644
index 4becb81..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitDescribeDTO.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@ApiModel("Describe鎻愪氦鍙傛暟")
-@EqualsAndHashCode(callSuper = true)
-public class SubmitDescribeDTO extends BaseSubmitDTO {
-
-	@ApiModelProperty(value = "鍥剧墖base64", required = true, example = "data:image/png;base64,xxx")
-	private String base64;
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitImagineDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitImagineDTO.java
deleted file mode 100644
index c8f306a..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitImagineDTO.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.util.List;
-
-
-@Data
-@ApiModel("Imagine鎻愪氦鍙傛暟")
-@EqualsAndHashCode(callSuper = true)
-public class SubmitImagineDTO extends BaseSubmitDTO {
-
-	@ApiModelProperty(value = "鎻愮ず璇�", required = true, example = "Cat")
-	private String prompt;
-
-	@ApiModelProperty(value = "鍨浘base64鏁扮粍")
-	private List<String> base64Array;
-
-	@ApiModelProperty(hidden = true)
-	@Deprecated(since = "3.0", forRemoval = true)
-	private String base64;
-
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitModalDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitModalDTO.java
deleted file mode 100644
index 38c5d86..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitModalDTO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ApiModel("灞�閮ㄩ噸缁樻彁浜ゅ弬鏁�")
-public class SubmitModalDTO extends BaseSubmitDTO{
-
-	private String maskBase64;
-
-	private String taskId;
-
-    private String prompt;
-
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitShortenDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitShortenDTO.java
deleted file mode 100644
index 8be2f8b..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitShortenDTO.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ApiModel("prompt鍒嗘瀽鎻愪氦鍙傛暟")
-public class SubmitShortenDTO extends BaseSubmitDTO{
-
-	private String botType;
-
-    private String prompt;
-
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitSimpleChangeDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitSimpleChangeDTO.java
deleted file mode 100644
index 62c8009..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/SubmitSimpleChangeDTO.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-
-@Data
-@ApiModel("鍙樺寲浠诲姟鎻愪氦鍙傛暟-simple")
-@EqualsAndHashCode(callSuper = true)
-public class SubmitSimpleChangeDTO extends BaseSubmitDTO {
-
-	@ApiModelProperty(value = "鍙樺寲鎻忚堪: ID $action$index", required = true, example = "1320098173412546 U2")
-	private String content;
-
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/TaskConditionDTO.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/TaskConditionDTO.java
deleted file mode 100644
index 8463477..0000000
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/dto/TaskConditionDTO.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.ruoyi.chat.dto;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-@ApiModel("浠诲姟鏌ヨ鍙傛暟")
-public class TaskConditionDTO {
-
-	private List<String> ids;
-
-}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java
new file mode 100644
index 0000000..f64e615
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java
@@ -0,0 +1,107 @@
+package org.ruoyi.chat.listener;
+
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import okhttp3.sse.EventSource;
+import okhttp3.sse.EventSourceListener;
+import org.jetbrains.annotations.NotNull;
+import org.ruoyi.common.chat.entity.chat.ChatCompletionResponse;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
+
+import java.util.Objects;
+
+/**
+ * 鎻忚堪锛歄penAIEventSourceListener
+ *
+ * @author https:www.unfbx.com
+ * @date 2023-02-22
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Component
+public class SSEEventSourceListener extends EventSourceListener {
+
+    @Autowired(required = false)
+    public SSEEventSourceListener(ResponseBodyEmitter emitter) {
+        this.emitter = emitter;
+    }
+
+    private ResponseBodyEmitter emitter;
+
+    private StringBuilder stringBuffer;
+
+    private String modelName;
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onOpen(EventSource eventSource, Response response) {
+        log.info("OpenAI寤虹珛sse杩炴帴...");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SneakyThrows
+    @Override
+    public void onEvent(@NotNull EventSource eventSource, String id, String type, String data) {
+        try {
+            if ("[DONE]".equals(data)) {
+                //鎴愬姛鍝嶅簲
+                emitter.complete();
+
+                // 鎵i櫎璐圭敤 (娑堣�楀瓧绗� 妯″瀷鍚嶇О)
+                return;
+            }
+            // 瑙f瀽杩斿洖鍐呭
+            ObjectMapper mapper = new ObjectMapper();
+            ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class);
+            if(completionResponse == null || CollectionUtil.isEmpty(completionResponse.getChoices())){
+                return;
+            }
+            Object content = completionResponse.getChoices().get(0).getDelta().getContent();
+            if(content == null){
+                content = completionResponse.getChoices().get(0).getDelta().getReasoningContent();
+                if(content == null) return;
+            }
+            if(StringUtils.isEmpty(modelName)){
+                modelName = completionResponse.getModel();
+            }
+            stringBuffer.append(content);
+            emitter.send(data);
+        } catch (Exception e) {
+            log.error("sse淇℃伅鎺ㄩ�佸け璐}鍐呭锛歿}",e.getMessage(),data);
+            eventSource.cancel();
+        }
+    }
+
+    @Override
+    public void onClosed(EventSource eventSource) {
+        log.info("OpenAI鍏抽棴sse杩炴帴...");
+    }
+
+    @SneakyThrows
+    @Override
+    public void onFailure(EventSource eventSource, Throwable t, Response response) {
+        if (Objects.isNull(response)) {
+            return;
+        }
+        ResponseBody body = response.body();
+        if (Objects.nonNull(body)) {
+            log.error("OpenAI  sse杩炴帴寮傚父data锛歿}锛屽紓甯革細{}", body.string(), t);
+        } else {
+            log.error("OpenAI  sse杩炴帴寮傚父data锛歿}锛屽紓甯革細{}", response, t);
+        }
+        eventSource.cancel();
+    }
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatCostService.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatCostService.java
new file mode 100644
index 0000000..234360a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatCostService.java
@@ -0,0 +1,43 @@
+package org.ruoyi.chat.service.chat;
+
+import org.ruoyi.domain.bo.ChatMessageBo;
+
+/**
+ * 璁¤垂绠$悊Service鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface IChatCostService {
+
+    /**
+     * 鏍规嵁娑堣�楃殑tokens鎵i櫎浣欓
+     *
+     * @param chatMessageBo
+     * @return 缁撴灉
+     */
+
+    void deductToken(ChatMessageBo chatMessageBo);
+
+    /**
+     * 鎵i櫎鐢ㄦ埛鐨勪綑棰�
+     *
+     */
+    void deductUserBalance(Long userId, Double numberCost);
+
+
+    /**
+     * 鎵i櫎浠诲姟璐圭敤骞朵笖淇濆瓨璁板綍
+     *
+     * @param type 浠诲姟绫诲瀷
+     * @param prompt 浠诲姟鎻忚堪
+     * @param cost 鎵i櫎璐圭敤
+     */
+    void taskDeduct(String type,String prompt, double cost);
+
+
+    /**
+     * 鍒ゆ柇鐢ㄦ埛鏄惁浠樿垂
+     */
+    void checkUserGrade();
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/ISseService.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/ISseService.java
new file mode 100644
index 0000000..84da5b4
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/ISseService.java
@@ -0,0 +1,65 @@
+package org.ruoyi.chat.service.chat;
+
+import jakarta.servlet.http.HttpServletRequest;
+import org.ruoyi.common.chat.domain.request.ChatRequest;
+import org.ruoyi.common.chat.entity.Tts.TextToSpeech;
+import org.ruoyi.common.chat.entity.files.UploadFileResponse;
+import org.ruoyi.common.chat.entity.whisper.WhisperResponse;
+import org.springframework.core.io.Resource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+
+/**
+ * 鐢ㄦ埛鑱婂ぉ绠$悊Service鎺ュ彛
+ *
+ * @author ageerle
+ * @date 2025-04-08
+ */
+public interface ISseService {
+
+    /**
+     * 瀹㈡埛绔彂閫佹秷鎭埌鏈嶅姟绔�
+     * @param chatRequest 璇锋眰瀵硅薄
+     */
+    SseEmitter sseChat(ChatRequest chatRequest, HttpServletRequest request);
+
+    /**
+     * 璇煶杞枃瀛�
+     * @param file 璇煶鏂囦欢
+     */
+   WhisperResponse speechToTextTranscriptionsV2(MultipartFile file);
+
+    /**
+     * 鏂囧瓧杞闊�
+     *
+     * @param textToSpeech 鏂囨湰淇℃伅
+     * @return 娴佸紡璇煶
+     */
+    ResponseEntity<Resource> textToSpeed(TextToSpeech textToSpeech);
+
+
+    /**
+     * 涓婁紶鏂囦欢鍒癮pi鏈嶅姟鍣�
+     *
+     * @param file 鏂囦欢淇℃伅
+     * @return 杩斿洖鏂囦欢淇℃伅
+     */
+    UploadFileResponse upload(MultipartFile file);
+
+
+    /**
+     * 浣跨敤ollama璋冪敤鏈湴妯″瀷
+     * @param chatRequest 瀵硅瘽淇℃伅
+     * @return 娴佸紡杈撳嚭杩斿洖鍐呭
+     */
+    SseEmitter ollamaChat(ChatRequest chatRequest);
+
+    /**
+     * 浼佷笟搴旂敤鍥炲
+     * @param prompt 鎻愮ず璇�
+     * @return 鍥炲鍐呭
+     */
+    String wxCpChat(String prompt);
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java
new file mode 100644
index 0000000..2e3e294
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java
@@ -0,0 +1,292 @@
+package org.ruoyi.chat.service.chat.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.extra.servlet.ServletUtil;
+import com.google.protobuf.ServiceException;
+import io.github.ollama4j.OllamaAPI;
+import io.github.ollama4j.models.chat.OllamaChatMessage;
+import io.github.ollama4j.models.chat.OllamaChatMessageRole;
+import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
+import io.github.ollama4j.models.chat.OllamaChatRequestModel;
+import io.github.ollama4j.models.generate.OllamaStreamHandler;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.ruoyi.chat.listener.SSEEventSourceListener;
+
+import org.ruoyi.chat.service.chat.ISseService;
+import org.ruoyi.common.chat.config.ChatConfig;
+import org.ruoyi.common.chat.domain.request.ChatRequest;
+import org.ruoyi.common.chat.entity.Tts.TextToSpeech;
+import org.ruoyi.common.chat.entity.chat.ChatCompletion;
+import org.ruoyi.common.chat.entity.chat.ChatCompletionResponse;
+
+import org.ruoyi.common.chat.entity.chat.Message;
+import org.ruoyi.common.chat.entity.files.UploadFileResponse;
+import org.ruoyi.common.chat.entity.whisper.WhisperResponse;
+import org.ruoyi.common.chat.openai.OpenAiStreamClient;
+import org.ruoyi.common.core.utils.file.FileUtils;
+import org.ruoyi.common.core.utils.file.MimeTypeUtils;
+
+import org.ruoyi.common.redis.utils.RedisUtils;
+import org.ruoyi.domain.vo.ChatModelVo;
+import org.ruoyi.service.IChatModelService;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class SseServiceImpl implements ISseService {
+
+    private OpenAiStreamClient openAiStreamClient;
+
+    private final ChatConfig chatConfig;
+
+    private final IChatModelService chatModelService;
+
+    @Override
+    public SseEmitter sseChat(ChatRequest chatRequest, HttpServletRequest request) {
+        SseEmitter sseEmitter = new SseEmitter(0L);
+        SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(sseEmitter);
+        // 鑾峰彇瀵硅瘽娑堟伅鍒楄〃
+        List<Message> messages = chatRequest.getMessages();
+        try {
+            if (StpUtil.isLogin()) {
+                // 閫氳繃妯″瀷鍚嶇О鏌ヨ妯″瀷淇℃伅
+                ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
+                // 鏋勫缓api璇锋眰瀹㈡埛绔�
+                openAiStreamClient = chatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey());
+
+                // 妯″瀷璁剧疆榛樿鎻愮ず璇�
+
+                // 鏄惁寮�鍚仈缃戞煡璇�
+            }else {
+                // 鏈櫥褰曠敤鎴烽檺鍒跺璇濇鏁�,榛樿5娆�
+                String clientIp = ServletUtil.getClientIP((javax.servlet.http.HttpServletRequest) request,"X-Forwarded-For");
+
+                int timeWindowInSeconds = 5;
+
+                String redisKey = "visitor:" + clientIp;
+                int count = 0;
+
+                if (RedisUtils.getCacheObject(redisKey) == null) {
+                    // 褰撳墠璁块棶娆℃暟
+                    RedisUtils.setCacheObject(redisKey, count, Duration.ofSeconds(86400));
+                }else {
+                    count = RedisUtils.getCacheObject(redisKey);
+                    if (count >= timeWindowInSeconds) {
+                        throw new ServiceException("褰撴棩鍏嶈垂娆℃暟宸茬敤瀹�");
+                    }
+                    count++;
+                    RedisUtils.setCacheObject(redisKey, count);
+                }
+            }
+
+            ChatCompletion completion = ChatCompletion
+                    .builder()
+                    .messages(messages)
+                    .model(chatRequest.getModel())
+                    .temperature(chatRequest.getTemperature())
+                    .topP(chatRequest.getTop_p())
+                    .stream(true)
+                    .build();
+            openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener);
+            // 淇濆瓨娑堟伅璁板綍 骞舵墸闄よ垂鐢�
+
+        } catch (Exception e) {
+            String message = e.getMessage();
+            sendErrorEvent(sseEmitter, message);
+            return sseEmitter;
+        }
+        return sseEmitter;
+    }
+
+
+    /**
+     * 鍙戦�丼SE閿欒浜嬩欢鐨勫皝瑁呮柟娉�
+     *
+     * @param sseEmitter
+     * @param errorMessage
+     */
+    private void sendErrorEvent(SseEmitter sseEmitter, String errorMessage) {
+        SseEmitter.SseEventBuilder event = SseEmitter.event()
+                .name("error")
+                .data(errorMessage);
+        try {
+            sseEmitter.send(event);
+        } catch (IOException e) {
+            log.error("鍙戦�佷簨浠跺け璐�: {}", e.getMessage());
+        }
+        sseEmitter.complete();
+    }
+
+    /**
+     * 鏂囧瓧杞闊�
+     */
+    @Override
+    public ResponseEntity<Resource> textToSpeed(TextToSpeech textToSpeech) {
+        ResponseBody body = openAiStreamClient.textToSpeech(textToSpeech);
+        if (body != null) {
+            // 灏哛esponseBody杞崲涓篒nputStreamResource
+            InputStreamResource resource = new InputStreamResource(body.byteStream());
+
+            // 鍒涘缓骞惰繑鍥濺esponseEntity
+            return ResponseEntity.ok()
+                .contentType(MediaType.parseMediaType("audio/mpeg"))
+                .body(resource);
+        } else {
+            // 濡傛灉ResponseBody涓虹┖锛岃繑鍥�404鐘舵�佺爜
+            return ResponseEntity.notFound().build();
+        }
+    }
+
+    /**
+     * 璇煶杞枃瀛�
+     */
+    @Override
+    public WhisperResponse speechToTextTranscriptionsV2(MultipartFile file) {
+        // 纭繚鏂囦欢涓嶄负绌�
+        if (file.isEmpty()) {
+            throw new IllegalStateException("Cannot convert an empty MultipartFile");
+        }
+        if (!FileUtils.isValidFileExtention(file, MimeTypeUtils.AUDIO__EXTENSION)) {
+            throw new IllegalStateException("File Extention not supported");
+        }
+        // 鍒涘缓涓�涓枃浠跺璞�
+        File fileA = new File(System.getProperty("java.io.tmpdir") + File.separator + file.getOriginalFilename());
+        try {
+            // 灏� MultipartFile 鐨勫唴瀹瑰啓鍏ユ枃浠�
+            file.transferTo(fileA);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to convert MultipartFile to File", e);
+        }
+        return openAiStreamClient.speechToTextTranscriptions(fileA);
+    }
+
+
+    @Override
+    public UploadFileResponse upload(MultipartFile file) {
+        if (file.isEmpty()) {
+            throw new IllegalStateException("Cannot upload an empty MultipartFile");
+        }
+        if (!FileUtils.isValidFileExtention(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION)) {
+            throw new IllegalStateException("File Extention not supported");
+        }
+        openAiStreamClient = chatConfig.getOpenAiStreamClient();
+        return openAiStreamClient.uploadFile("fine-tune", convertMultiPartToFile(file));
+    }
+
+    private File convertMultiPartToFile(MultipartFile multipartFile) {
+        File file = null;
+        try {
+            // 鑾峰彇鍘熷鏂囦欢鍚�
+            String originalFileName = multipartFile.getOriginalFilename();
+            // 榛樿鎵╁睍鍚�
+            String extension = ".tmp";
+            // 灏濊瘯浠庡師濮嬫枃浠跺悕涓幏鍙栨墿灞曞悕
+            if (originalFileName != null && originalFileName.contains(".")) {
+                extension = originalFileName.substring(originalFileName.lastIndexOf("."));
+            }
+
+            // 浣跨敤鍘熷鏂囦欢鐨勬墿灞曞悕鍒涘缓涓存椂鏂囦欢
+            Path tempFile = Files.createTempFile(null, extension);
+            file = tempFile.toFile();
+
+            // 灏哅ultipartFile鐨勫唴瀹瑰啓鍏ユ枃浠�
+            try (InputStream inputStream = multipartFile.getInputStream();
+                 FileOutputStream outputStream = new FileOutputStream(file)) {
+                int read;
+                byte[] bytes = new byte[1024];
+                while ((read = inputStream.read(bytes)) != -1) {
+                    outputStream.write(bytes, 0, read);
+                }
+            } catch (IOException e) {
+                // 澶勭悊鏂囦欢鍐欏叆寮傚父
+                e.printStackTrace();
+            }
+        } catch (IOException e) {
+            // 澶勭悊涓存椂鏂囦欢鍒涘缓寮傚父
+            e.printStackTrace();
+        }
+        return file;
+    }
+
+    @Override
+    public SseEmitter ollamaChat(ChatRequest chatRequest) {
+        String[] parts = chatRequest.getModel().split("ollama-");
+        ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
+        final SseEmitter emitter = new SseEmitter();
+        String host = chatModelVo.getApiHost();
+        List<Message> msgList = chatRequest.getMessages();
+        List<OllamaChatMessage> messages = new ArrayList<>();
+
+        for (Message message : msgList) {
+            OllamaChatMessage ollamaChatMessage = new OllamaChatMessage();
+            ollamaChatMessage.setRole(OllamaChatMessageRole.USER);
+            ollamaChatMessage.setContent(message.getContent().toString());
+            messages.add(ollamaChatMessage);
+        }
+        OllamaAPI api = new OllamaAPI(host);
+        api.setRequestTimeoutSeconds(100);
+        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(parts[1]);
+
+        OllamaChatRequestModel requestModel = builder
+            .withMessages(messages)
+            .build();
+
+        // 寮傛鎵ц OllAma API 璋冪敤
+        CompletableFuture.runAsync(() -> {
+            try {
+                StringBuilder response = new StringBuilder();
+                OllamaStreamHandler streamHandler = (s) -> {
+                    String substr = s.substring(response.length());
+                    response.append(substr);
+                    System.out.println(substr);
+                    try {
+                        emitter.send(substr);
+                    } catch (IOException e) {
+                        sendErrorEvent(emitter, e.getMessage());
+                    }
+                };
+                api.chat(requestModel, streamHandler);
+                emitter.complete();
+            } catch (Exception e) {
+                sendErrorEvent(emitter, e.getMessage());
+            }
+        });
+        return emitter;
+    }
+
+    @Override
+    public String wxCpChat(String prompt) {
+        List<Message> messageList = new ArrayList<>();
+        Message message = Message.builder().role(Message.Role.USER).content(prompt).build();
+        messageList.add(message);
+        ChatCompletion chatCompletion = ChatCompletion
+            .builder()
+            .messages(messageList)
+            .model("gpt-4o-mini")
+            .stream(false)
+            .build();
+        ChatCompletionResponse chatCompletionResponse = openAiStreamClient.chatCompletion(chatCompletion);
+        return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString();
+    }
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java
new file mode 100644
index 0000000..66a6577
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java
@@ -0,0 +1,64 @@
+package org.ruoyi.chat.service.knowledge.vectorizer;
+
+import com.google.gson.Gson;
+import io.github.ollama4j.OllamaAPI;
+import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
+import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.service.VectorizationService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BgeLargeVectorization implements VectorizationService {
+
+    String host = "http://localhost:11434/";
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    @Override
+    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
+        OllamaAPI ollamaAPI = new OllamaAPI(host);
+        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+        List<Double> doubleVector;
+        try {
+            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), new Gson().toJson(chunkList)));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        List<List<Double>> vectorList = new ArrayList<>();
+        vectorList.add(doubleVector);
+        return vectorList;
+    }
+
+    @Override
+    public List<Double> singleVectorization(String chunk, String kid) {
+        List<String> chunkList = new ArrayList<>();
+        chunkList.add(chunk);
+        List<List<Double>> vectorList = batchVectorization(chunkList, kid);
+        return vectorList.get(0);
+    }
+
+    public static void main(String[] args) {
+        OllamaAPI ollamaAPI = new OllamaAPI("http://localhost:11434/");
+        List<String> chunkList = Arrays.asList("澶╁緢钃�", "娴峰緢娣�");
+        List<Double> doubleVector;
+        try {
+            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel("quentinz/bge-large-zh-v1.5", new Gson().toJson(chunkList)));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("=== " + doubleVector + " 1===");
+    }
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java
new file mode 100644
index 0000000..6365a77
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java
@@ -0,0 +1,110 @@
+package org.ruoyi.chat.service.knowledge.vectorizer;
+
+import jakarta.annotation.Resource;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.common.chat.config.ChatConfig;
+import org.ruoyi.common.chat.entity.embeddings.Embedding;
+import org.ruoyi.common.chat.entity.embeddings.EmbeddingResponse;
+import org.ruoyi.common.chat.openai.OpenAiStreamClient;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.service.VectorizationService;
+import org.ruoyi.system.domain.SysModel;
+import org.ruoyi.system.service.ISysModelService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OpenAiVectorization implements VectorizationService {
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    @Lazy
+    @Resource
+    private ISysModelService sysModelService;
+
+    @Getter
+    private OpenAiStreamClient openAiStreamClient;
+
+    private final ChatConfig chatConfig;
+
+    @Override
+    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
+        List<List<Double>> vectorList;
+        // 鑾峰彇鐭ヨ瘑搴撲俊鎭�
+        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+        if(knowledgeInfoVo == null){
+            log.warn("鐭ヨ瘑搴撲笉瀛樺湪:璇锋煡妫�ID {}",kid);
+            vectorList=new ArrayList<>();
+            vectorList.add(new ArrayList<>());
+            return vectorList;
+        }
+        SysModel sysModel = sysModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
+        String apiHost= sysModel.getApiHost();
+        String apiKey= sysModel.getApiKey();
+        openAiStreamClient = chatConfig.createOpenAiStreamClient(apiHost,apiKey);
+
+        Embedding embedding = buildEmbedding(chunkList, knowledgeInfoVo);
+        EmbeddingResponse embeddings = openAiStreamClient.embeddings(embedding);
+
+        // 澶勭悊 OpenAI 杩斿洖鐨勫祵鍏ユ暟鎹�
+        vectorList = processOpenAiEmbeddings(embeddings);
+
+        return vectorList;
+    }
+
+    /**
+     * 鏋勫缓 Embedding 瀵硅薄
+     */
+    private Embedding buildEmbedding(List<String> chunkList, KnowledgeInfoVo knowledgeInfoVo) {
+        return Embedding.builder()
+                .input(chunkList)
+                .model(knowledgeInfoVo.getVectorModel())
+                .build();
+    }
+
+    /**
+     * 澶勭悊 OpenAI 杩斿洖鐨勫祵鍏ユ暟鎹�
+     */
+    private List<List<Double>> processOpenAiEmbeddings(EmbeddingResponse embeddings) {
+        List<List<Double>> vectorList = new ArrayList<>();
+
+        embeddings.getData().forEach(data -> {
+            List<BigDecimal> vector = data.getEmbedding();
+            List<Double> doubleVector = convertToDoubleList(vector);
+            vectorList.add(doubleVector);
+        });
+
+        return vectorList;
+    }
+
+    /**
+     * 灏� BigDecimal 杞崲涓� Double 鍒楄〃
+     */
+    private List<Double> convertToDoubleList(List<BigDecimal> vector) {
+        return vector.stream()
+                .map(BigDecimal::doubleValue)
+                .collect(Collectors.toList());
+    }
+
+
+    @Override
+    public List<Double> singleVectorization(String chunk, String kid) {
+        List<String> chunkList = new ArrayList<>();
+        chunkList.add(chunk);
+        List<List<Double>> vectorList = batchVectorization(chunkList, kid);
+        return vectorList.get(0);
+    }
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/VectorizationFactory.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/VectorizationFactory.java
new file mode 100644
index 0000000..18a0b9a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/VectorizationFactory.java
@@ -0,0 +1,47 @@
+package org.ruoyi.chat.service.knowledge.vectorizer;
+
+import cn.hutool.core.util.StrUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.service.VectorizationService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鏂囨湰鍚戦噺鍖�
+ * @author huangkh
+ */
+@Component
+@Slf4j
+public class VectorizationFactory {
+
+    private final OpenAiVectorization openAiVectorization;
+
+    private final BgeLargeVectorization bgeLargeVectorization;
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    public VectorizationFactory(OpenAiVectorization openAiVectorization, BgeLargeVectorization bgeLargeVectorization) {
+        this.openAiVectorization = openAiVectorization;
+        this.bgeLargeVectorization = bgeLargeVectorization;
+    }
+
+    public VectorizationService getEmbedding(String kid){
+        String vectorModel = "text-embedding-3-small";
+        if (StrUtil.isNotEmpty(kid)) {
+            KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+            if (knowledgeInfoVo != null && StrUtil.isNotEmpty(knowledgeInfoVo.getVectorModel())) {
+                vectorModel = knowledgeInfoVo.getVectorModel();
+            }
+        }
+        return switch (vectorModel) {
+            case "quentinz/bge-large-zh-v1.5" -> bgeLargeVectorization;
+            default -> openAiVectorization;
+        };
+    }
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java
new file mode 100644
index 0000000..8a271aa
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java
@@ -0,0 +1,397 @@
+package org.ruoyi.chat.service.knowledge.vectorstore;
+
+import io.milvus.client.MilvusServiceClient;
+import io.milvus.grpc.DataType;
+import io.milvus.grpc.DescribeIndexResponse;
+import io.milvus.grpc.MutationResult;
+import io.milvus.grpc.SearchResults;
+import io.milvus.param.*;
+import io.milvus.param.collection.*;
+import io.milvus.param.dml.DeleteParam;
+import io.milvus.param.dml.InsertParam;
+import io.milvus.param.dml.SearchParam;
+import io.milvus.param.index.CreateIndexParam;
+import io.milvus.param.index.DescribeIndexParam;
+import io.milvus.param.partition.CreatePartitionParam;
+import io.milvus.response.QueryResultsWrapper;
+import io.milvus.response.SearchResultsWrapper;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.ruoyi.common.core.service.ConfigService;
+
+import org.ruoyi.service.VectorStoreService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Service
+@Slf4j
+public class MilvusVectorStore implements VectorStoreService {
+
+    private volatile Integer dimension;
+    private volatile String collectionName;
+    private MilvusServiceClient milvusServiceClient;
+
+    @Resource
+    private ConfigService configService;
+
+    @PostConstruct
+    public void loadConfig() {
+        this.dimension = Integer.parseInt(configService.getConfigValue("milvus", "dimension"));
+        this.collectionName = configService.getConfigValue("milvus", "collection");
+    }
+
+    @PostConstruct
+    public void init() {
+        String milvusHost = configService.getConfigValue("milvus", "host");
+        String milvausPort = configService.getConfigValue("milvus", "port");
+        milvusServiceClient = new MilvusServiceClient(
+                ConnectParam.newBuilder()
+                        .withHost(milvusHost)
+                        .withPort(Integer.parseInt(milvausPort))
+                        .withDatabaseName("default")
+                        .build()
+        );
+    }
+
+    private void createSchema(String kid) {
+        FieldType primaryField = FieldType.newBuilder()
+                .withName("row_id")
+                .withDataType(DataType.Int64)
+                .withPrimaryKey(true)
+                .withAutoID(true)
+                .build();
+        FieldType contentField = FieldType.newBuilder()
+                .withName("content")
+                .withDataType(DataType.VarChar)
+                .withMaxLength(1000)
+                .build();
+        FieldType kidField = FieldType.newBuilder()
+                .withName("kid")
+                .withDataType(DataType.VarChar)
+                .withMaxLength(20)
+                .build();
+        FieldType docIdField = FieldType.newBuilder()
+                .withName("docId")
+                .withDataType(DataType.VarChar)
+                .withMaxLength(20)
+                .build();
+        FieldType fidField = FieldType.newBuilder()
+                .withName("fid")
+                .withDataType(DataType.VarChar)
+                .withMaxLength(20)
+                .build();
+        FieldType vectorField = FieldType.newBuilder()
+                .withName("fv")
+                .withDataType(DataType.FloatVector)
+                .withDimension(dimension)
+                .build();
+        CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder()
+                .withCollectionName(collectionName + kid)
+                .withDescription("local knowledge")
+                .addFieldType(primaryField)
+                .addFieldType(contentField)
+                .addFieldType(kidField)
+                .addFieldType(docIdField)
+                .addFieldType(fidField)
+                .addFieldType(vectorField)
+                .build();
+        milvusServiceClient.createCollection(createCollectionReq);
+
+        // 鍒涘缓鍚戦噺鐨勭储寮�
+        IndexType INDEX_TYPE = IndexType.IVF_FLAT;
+        String INDEX_PARAM = "{\"nlist\":1024}";
+        milvusServiceClient.createIndex(
+                CreateIndexParam.newBuilder()
+                        .withCollectionName(collectionName + kid)
+                        .withFieldName("fv")
+                        .withIndexType(INDEX_TYPE)
+                        .withMetricType(MetricType.IP)
+                        .withExtraParam(INDEX_PARAM)
+                        .withSyncMode(Boolean.FALSE)
+                        .build()
+        );
+
+    }
+
+    @Override
+    public void newSchema(String kid) {
+        createSchema(kid);
+    }
+
+    @Override
+    public void removeByKidAndFid(String kid, String fid) {
+        milvusServiceClient.delete(
+                DeleteParam.newBuilder()
+                        .withCollectionName(collectionName + kid)
+                        .withExpr("fid == " + fid)
+                        .build()
+        );
+    }
+
+    @Override
+    public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
+        String fullCollectionName = collectionName + kid;
+
+        // 妫�鏌ラ泦鍚堟槸鍚﹀瓨鍦�
+        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .build();
+        R<Boolean> booleanR = milvusServiceClient.hasCollection(hasCollectionParam);
+
+        if (booleanR.getStatus() == R.Status.Success.getCode()) {
+            boolean collectionExists = booleanR.getData().booleanValue();
+            if (!collectionExists) {
+                // 闆嗗悎涓嶅瓨鍦紝鍒涘缓闆嗗悎
+                List<FieldType> fieldTypes = new ArrayList<>();
+                // 鍋囪杩欓噷瀹氫箟 id 瀛楁锛屾牴鎹疄闄呮儏鍐典慨鏀�
+                FieldType idField = FieldType.newBuilder()
+                        .withName("id")
+                        .withDataType(DataType.Int64)
+                        .withPrimaryKey(true)
+                        .withAutoID(true)
+                        .build();
+                fieldTypes.add(idField);
+
+                // 瀹氫箟鍚戦噺瀛楁
+                FieldType vectorField = FieldType.newBuilder()
+                        .withName("fv")
+                        .withDataType(DataType.FloatVector)
+                        .withDimension(vectorList.get(0).size())
+                        .build();
+                fieldTypes.add(vectorField);
+
+                // 瀹氫箟鍏朵粬瀛楁
+                FieldType contentField = FieldType.newBuilder()
+                        .withName("content")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(chunkList.size() * 1024) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(contentField);
+
+                FieldType kidField = FieldType.newBuilder()
+                        .withName("kid")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(kidField);
+
+                FieldType docIdField = FieldType.newBuilder()
+                        .withName("docId")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(docIdField);
+
+                FieldType fidField = FieldType.newBuilder()
+                        .withName("fid")
+                        .withDataType(DataType.VarChar)
+                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
+                        .build();
+                fieldTypes.add(fidField);
+
+                CreateCollectionParam createCollectionParam = CreateCollectionParam.newBuilder()
+                        .withCollectionName(fullCollectionName)
+                        .withFieldTypes(fieldTypes)
+                        .build();
+
+                R<RpcStatus> collection = milvusServiceClient.createCollection(createCollectionParam);
+                if (collection.getStatus() == R.Status.Success.getCode()) {
+                    System.out.println("闆嗗悎 " + fullCollectionName + " 鍒涘缓鎴愬姛");
+
+                    // 鍒涘缓绱㈠紩
+                    CreateIndexParam createIndexParam = CreateIndexParam.newBuilder()
+                            .withCollectionName(fullCollectionName)
+                            .withFieldName("fv") // 鍚戦噺瀛楁鍚�
+                            .withIndexType(IndexType.IVF_FLAT) // 绱㈠紩绫诲瀷
+                            .withMetricType(MetricType.IP)
+                            .withExtraParam("{\"nlist\":1024}") // 绱㈠紩鍙傛暟
+                            .build();
+                    R<RpcStatus> indexResponse = milvusServiceClient.createIndex(createIndexParam);
+                    if (indexResponse.getStatus() == R.Status.Success.getCode()) {
+                        System.out.println("绱㈠紩鍒涘缓鎴愬姛");
+                    } else {
+                        System.err.println("绱㈠紩鍒涘缓澶辫触: " + indexResponse.getMessage());
+                        return;
+                    }
+                } else {
+                    System.err.println("闆嗗悎鍒涘缓澶辫触: " + collection.getMessage());
+                    return;
+                }
+            }
+        } else {
+            System.err.println("妫�鏌ラ泦鍚堟槸鍚﹀瓨鍦ㄦ椂鍑洪敊: " + booleanR.getMessage());
+            return;
+        }
+
+        if (StringUtils.isNotBlank(docId)) {
+            milvusServiceClient.createPartition(
+                    CreatePartitionParam.newBuilder()
+                            .withCollectionName(fullCollectionName)
+                            .withPartitionName(docId)
+                            .build()
+            );
+        }
+
+        List<List<Float>> vectorFloatList = new ArrayList<>();
+        List<String> kidList = new ArrayList<>();
+        List<String> docIdList = new ArrayList<>();
+        for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) {
+            List<Double> vector = vectorList.get(i);
+            List<Float> vfList = new ArrayList<>();
+            for (int j = 0; j < vector.size(); j++) {
+                Double value = vector.get(j);
+                vfList.add(value.floatValue());
+            }
+            vectorFloatList.add(vfList);
+            kidList.add(kid);
+            docIdList.add(docId);
+        }
+        List<InsertParam.Field> fields = new ArrayList<>();
+        fields.add(new InsertParam.Field("content", chunkList));
+        fields.add(new InsertParam.Field("kid", kidList));
+        fields.add(new InsertParam.Field("docId", docIdList));
+        fields.add(new InsertParam.Field("fid", fidList));
+        fields.add(new InsertParam.Field("fv", vectorFloatList));
+
+        InsertParam insertParam = InsertParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .withPartitionName(docId)
+                .withFields(fields)
+                .build();
+        System.out.println("=========================");
+
+        R<MutationResult> insert = milvusServiceClient.insert(insertParam);
+        if (insert.getStatus() == R.Status.Success.getCode()) {
+            System.out.println("鎻掑叆鎴愬姛锛屾彃鍏ョ殑琛屾暟: " + insert.getData().getInsertCnt());
+        } else {
+            System.err.println("鎻掑叆澶辫触: " + insert.getMessage());
+        }
+        System.out.println("=========================");
+        // milvus鍦ㄥ皢鏁版嵁瑁呰浇鍒板唴瀛樺悗鎵嶈兘杩涜鍚戦噺璁$畻.
+        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .build();
+        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
+        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
+            System.err.println("鍔犺浇闆嗗悎 " + fullCollectionName + " 鍒板唴瀛樻椂鍑洪敊锛�" + loadResponse.getMessage());
+        }
+//        milvusServiceClient.loadCollection(LoadCollectionParam.newBuilder().withCollectionName(fullCollectionName).build());
+    }
+
+
+    @Override
+    public void removeByDocId(String kid, String docId) {
+        milvusServiceClient.delete(
+                DeleteParam.newBuilder()
+                        .withCollectionName(collectionName + kid)
+                        .withExpr("1 == 1")
+                        .withPartitionName(docId)
+                        .build()
+        );
+    }
+
+    @Override
+    public void removeByKid(String kid) {
+        milvusServiceClient.dropCollection(
+                DropCollectionParam.newBuilder()
+                        .withCollectionName(collectionName + kid)
+                        .build()
+        );
+    }
+
+    @Override
+    public List<String> nearest(List<Double> queryVector, String kid) {
+        String fullCollectionName = collectionName + kid;
+
+        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder()
+                .withCollectionName(fullCollectionName)
+                .build();
+
+        R<Boolean> booleanR = milvusServiceClient.hasCollection(hasCollectionParam);
+        if (booleanR.getStatus() != R.Status.Success.getCode() || !booleanR.getData().booleanValue()) {
+            System.err.println("闆嗗悎 " + fullCollectionName + " 涓嶅瓨鍦ㄦ垨妫�鏌ラ泦鍚堝瓨鍦ㄦ�ф椂鍑洪敊銆�");
+            return new ArrayList<>();
+        }
+
+        DescribeIndexParam describeIndexParam = DescribeIndexParam.newBuilder().withCollectionName(fullCollectionName).build();
+
+        R<DescribeIndexResponse> describeIndexResponseR = milvusServiceClient.describeIndex(describeIndexParam);
+
+        if (describeIndexResponseR.getStatus() == R.Status.Success.getCode()) {
+            System.out.println("绱㈠紩淇℃伅: " + describeIndexResponseR.getData().getIndexDescriptionsCount());
+        } else {
+            System.err.println("鑾峰彇绱㈠紩澶辫触: " + describeIndexResponseR.getMessage());
+        }
+
+//        // 鍔犺浇闆嗗悎鍒板唴瀛�
+//        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
+//                .withCollectionName(fullCollectionName)
+//                .build();
+//        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
+//        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
+//            System.err.println("鍔犺浇闆嗗悎 " + fullCollectionName + " 鍒板唴瀛樻椂鍑洪敊锛�" + loadResponse.getMessage());
+//            return new ArrayList<>();
+//        }
+
+        List<String> search_output_fields = Arrays.asList("content", "fv");
+        List<Float> fv = new ArrayList<>();
+        for (int i = 0; i < queryVector.size(); i++) {
+            fv.add(queryVector.get(i).floatValue());
+        }
+        List<List<Float>> vectors = new ArrayList<>();
+        vectors.add(fv);
+        String search_param = "{\"nprobe\":10, \"offset\":0}";
+        SearchParam searchParam = SearchParam.newBuilder()
+                .withCollectionName(collectionName + kid)
+                .withMetricType(MetricType.IP)
+                .withOutFields(search_output_fields)
+                .withTopK(10)
+                .withVectors(vectors)
+                .withVectorFieldName("fv")
+                .withParams(search_param)
+                .build();
+        System.out.println("SearchParam: " + searchParam.toString());
+        R<SearchResults> respSearch = milvusServiceClient.search(searchParam);
+        if (respSearch.getStatus() == R.Status.Success.getCode()) {
+            SearchResults searchResults = respSearch.getData();
+            if (searchResults != null) {
+                System.out.println(searchResults.getResults());
+                SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(searchResults.getResults());
+                List<QueryResultsWrapper.RowRecord> rowRecords = wrapperSearch.getRowRecords();
+
+                List<String> resultList = new ArrayList<>();
+                if (rowRecords != null && !rowRecords.isEmpty()) {
+                    for (QueryResultsWrapper.RowRecord rowRecord : rowRecords) {
+                        String content = rowRecord.get("content").toString();
+                        resultList.add(content);
+                    }
+                }
+                return resultList;
+            } else {
+                System.err.println("鎼滅储缁撴灉涓虹┖");
+            }
+        } else {
+            System.err.println("鎼滅储鎿嶄綔澶辫触: " + respSearch.getMessage());
+        }
+        return new ArrayList<>();
+
+    }
+
+    /**
+     * milvus 涓嶆敮鎸侀�氳繃鏂囨湰妫�绱㈢浉浼兼��
+     *
+     * @param query
+     * @param kid
+     * @return
+     */
+    @Override
+    public List<String> nearest(String query, String kid) {
+        return null;
+    }
+
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/VectorStoreFactory.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/VectorStoreFactory.java
new file mode 100644
index 0000000..10ce84d
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/VectorStoreFactory.java
@@ -0,0 +1,42 @@
+package org.ruoyi.chat.service.knowledge.vectorstore;
+
+import cn.hutool.core.util.StrUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.mapper.KnowledgeInfoMapper;
+import org.ruoyi.service.VectorStoreService;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class VectorStoreFactory {
+
+    private final WeaviateVectorStore weaviateVectorStore;
+
+    private final MilvusVectorStore milvusVectorStore;
+
+    @Resource
+    private KnowledgeInfoMapper knowledgeInfoMapper;
+
+    public VectorStoreFactory(WeaviateVectorStore weaviateVectorStore, MilvusVectorStore milvusVectorStore) {
+        this.weaviateVectorStore = weaviateVectorStore;
+        this.milvusVectorStore = milvusVectorStore;
+    }
+
+    public VectorStoreService getVectorStore(String kid){
+        String vectorModel = "weaviate";
+        if (StrUtil.isNotEmpty(kid)) {
+            KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoMapper.selectVoById(Long.valueOf(kid));
+            if (knowledgeInfoVo != null && StrUtil.isNotEmpty(knowledgeInfoVo.getVector())) {
+                vectorModel = knowledgeInfoVo.getVector();
+            }
+        }
+        if ("weaviate".equals(vectorModel)){
+            return weaviateVectorStore;
+        }else if ("milvus".equals(vectorModel)){
+            return milvusVectorStore;
+        }
+        return null;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/WeaviateVectorStore.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/WeaviateVectorStore.java
new file mode 100644
index 0000000..147fc50
--- /dev/null
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/WeaviateVectorStore.java
@@ -0,0 +1,402 @@
+package org.ruoyi.chat.service.knowledge.vectorstore;
+
+import cn.hutool.core.lang.UUID;
+import cn.hutool.json.JSONObject;
+import com.google.gson.internal.LinkedTreeMap;
+import io.weaviate.client.Config;
+import io.weaviate.client.WeaviateClient;
+import io.weaviate.client.base.Result;
+import io.weaviate.client.v1.data.model.WeaviateObject;
+import io.weaviate.client.v1.data.replication.model.ConsistencyLevel;
+import io.weaviate.client.v1.filters.Operator;
+import io.weaviate.client.v1.filters.WhereFilter;
+import io.weaviate.client.v1.graphql.model.GraphQLResponse;
+import io.weaviate.client.v1.graphql.query.argument.NearTextArgument;
+import io.weaviate.client.v1.graphql.query.argument.NearVectorArgument;
+import io.weaviate.client.v1.graphql.query.fields.Field;
+import io.weaviate.client.v1.misc.model.Meta;
+import io.weaviate.client.v1.misc.model.ReplicationConfig;
+import io.weaviate.client.v1.misc.model.ShardingConfig;
+import io.weaviate.client.v1.misc.model.VectorIndexConfig;
+import io.weaviate.client.v1.schema.model.DataType;
+import io.weaviate.client.v1.schema.model.Property;
+import io.weaviate.client.v1.schema.model.Schema;
+import io.weaviate.client.v1.schema.model.WeaviateClass;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.ruoyi.common.core.service.ConfigService;
+import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.service.VectorStoreService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class WeaviateVectorStore implements VectorStoreService {
+
+    private volatile String protocol;
+    private volatile String host;
+    private volatile String className;
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    @Lazy
+    @Resource
+    private ConfigService configService;
+
+    @PostConstruct
+    public void loadConfig() {
+        this.protocol = configService.getConfigValue("weaviate", "protocol");
+        this.host = configService.getConfigValue("weaviate", "host");
+        this.className = configService.getConfigValue("weaviate", "classname");
+    }
+
+    public WeaviateClient getClient() {
+        Config config = new Config(protocol, host);
+        WeaviateClient client = new WeaviateClient(config);
+        return client;
+    }
+
+    public Result<Meta> getMeta() {
+        WeaviateClient client = getClient();
+        Result<Meta> meta = client.misc().metaGetter().run();
+        if (meta.getError() == null) {
+            System.out.printf("meta.hostname: %s\n", meta.getResult().getHostname());
+            System.out.printf("meta.version: %s\n", meta.getResult().getVersion());
+            System.out.printf("meta.modules: %s\n", meta.getResult().getModules());
+        } else {
+            System.out.printf("Error: %s\n", meta.getError().getMessages());
+        }
+        return meta;
+    }
+
+    public Result<Schema> getSchemas() {
+        WeaviateClient client = getClient();
+        Result<Schema> result = client.schema().getter().run();
+        if (result.hasErrors()) {
+            System.out.println(result.getError());
+        } else {
+            System.out.println(result.getResult());
+        }
+        return result;
+    }
+
+
+    public Result<Boolean> createSchema(String kid) {
+        WeaviateClient client = getClient();
+
+        VectorIndexConfig vectorIndexConfig = VectorIndexConfig.builder()
+                .distance("cosine")
+                .cleanupIntervalSeconds(300)
+                .efConstruction(128)
+                .maxConnections(64)
+                .vectorCacheMaxObjects(500000L)
+                .ef(-1)
+                .skip(false)
+                .dynamicEfFactor(8)
+                .dynamicEfMax(500)
+                .dynamicEfMin(100)
+                .flatSearchCutoff(40000)
+                .build();
+
+        ShardingConfig shardingConfig = ShardingConfig.builder()
+                .desiredCount(3)
+                .desiredVirtualCount(128)
+                .function("murmur3")
+                .key("_id")
+                .strategy("hash")
+                .virtualPerPhysical(128)
+                .build();
+
+        ReplicationConfig replicationConfig = ReplicationConfig.builder()
+                .factor(1)
+                .build();
+
+        JSONObject classModuleConfigValue = new JSONObject();
+        classModuleConfigValue.put("vectorizeClassName", false);
+        JSONObject classModuleConfig = new JSONObject();
+        classModuleConfig.put("text2vec-transformers", classModuleConfigValue);
+
+        JSONObject propertyModuleConfigValueSkipTrue = new JSONObject();
+        propertyModuleConfigValueSkipTrue.put("vectorizePropertyName", false);
+        propertyModuleConfigValueSkipTrue.put("skip", true);
+        JSONObject propertyModuleConfigSkipTrue = new JSONObject();
+        propertyModuleConfigSkipTrue.put("text2vec-transformers", propertyModuleConfigValueSkipTrue);
+
+        JSONObject propertyModuleConfigValueSkipFalse = new JSONObject();
+        propertyModuleConfigValueSkipFalse.put("vectorizePropertyName", false);
+        propertyModuleConfigValueSkipFalse.put("skip", false);
+        JSONObject propertyModuleConfigSkipFalse = new JSONObject();
+        propertyModuleConfigSkipFalse.put("text2vec-transformers", propertyModuleConfigValueSkipFalse);
+
+        WeaviateClass clazz = WeaviateClass.builder()
+                .className(className + kid)
+                .description("local knowledge")
+                .vectorIndexType("hnsw")
+                .vectorizer("text2vec-transformers")
+                .shardingConfig(shardingConfig)
+                .vectorIndexConfig(vectorIndexConfig)
+                .replicationConfig(replicationConfig)
+                .moduleConfig(classModuleConfig)
+                .properties(new ArrayList() {
+                    {
+                        add(Property.builder()
+                                .dataType(new ArrayList() {
+                                    {
+                                        add(DataType.TEXT);
+                                    }
+                                })
+                                .name("content")
+                                .description("The content of the local knowledge,for search")
+                                .moduleConfig(propertyModuleConfigSkipFalse)
+                                .build());
+                        add(Property.builder()
+                                .dataType(new ArrayList() {
+                                    {
+                                        add(DataType.TEXT);
+                                    }
+                                })
+                                .name("kid")
+                                .description("The knowledge id of the local knowledge,for search")
+                                .moduleConfig(propertyModuleConfigSkipTrue)
+                                .build());
+                        add(Property.builder()
+                                .dataType(new ArrayList() {
+                                    {
+                                        add(DataType.TEXT);
+                                    }
+                                })
+                                .name("docId")
+                                .description("The doc id of the local knowledge,for search")
+                                .moduleConfig(propertyModuleConfigSkipTrue)
+                                .build());
+                        add(Property.builder()
+                                .dataType(new ArrayList() {
+                                    {
+                                        add(DataType.TEXT);
+                                    }
+                                })
+                                .name("fid")
+                                .description("The fragment id of the local knowledge,for search")
+                                .moduleConfig(propertyModuleConfigSkipTrue)
+                                .build());
+                        add(Property.builder()
+                                .dataType(new ArrayList() {
+                                    {
+                                        add(DataType.TEXT);
+                                    }
+                                })
+                                .name("uuid")
+                                .description("The uuid id of the local knowledge fragment(same with id properties),for search")
+                                .moduleConfig(propertyModuleConfigSkipTrue)
+                                .build());
+                    } })
+                .build();
+
+        Result<Boolean> result = client.schema().classCreator().withClass(clazz).run();
+        if (result.hasErrors()) {
+            System.out.println(result.getError());
+        }
+        System.out.println(result.getResult());
+        return result;
+    }
+
+    @Override
+    public void newSchema(String kid) {
+        createSchema(kid);
+    }
+
+    @Override
+    public void removeByKidAndFid(String kid, String fid) {
+        List<String> resultList = new ArrayList<>();
+        WeaviateClient client = getClient();
+        Field fieldId = Field.builder().name("uuid").build();
+        WhereFilter where = WhereFilter.builder()
+                .path(new String[]{"fid"})
+                .operator(Operator.Equal)
+                .valueString(fid)
+                .build();
+        Result<GraphQLResponse> result = client.graphQL().get()
+                .withClassName(className + kid)
+                .withFields(fieldId)
+                .withWhere(where)
+                .run();
+        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
+        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
+        ArrayList<LinkedTreeMap> m = l.get(className + kid);
+        for (LinkedTreeMap linkedTreeMap : m) {
+            String uuid = linkedTreeMap.get("uuid").toString();
+            resultList.add(uuid);
+        }
+        for (String uuid : resultList) {
+            Result<Boolean> deleteResult = client.data().deleter()
+                    .withID(uuid)
+                    .withClassName(className + kid)
+                    .withConsistencyLevel(ConsistencyLevel.ALL)  // default QUORUM
+                    .run();
+        }
+    }
+
+    @Override
+    public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
+        WeaviateClient client = getClient();
+
+        for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) {
+            List<Double> vector = vectorList.get(i);
+            Float[] vf = vector.stream().map(Double::floatValue).toArray(Float[]::new);
+
+            Map<String, Object> dataSchema = new HashMap<>();
+            dataSchema.put("content", chunkList.get(i));
+            dataSchema.put("kid", kid);
+            dataSchema.put("docId", docId);
+            dataSchema.put("fid", fidList.get(i));
+            String uuid = UUID.randomUUID().toString();
+            dataSchema.put("uuid", uuid);
+
+            Result<WeaviateObject> result = client.data().creator()
+                    .withClassName(className + kid)
+                    .withID(uuid)
+                    .withVector(vf)
+                    .withProperties(dataSchema)
+                    .run();
+        }
+
+    }
+
+    @Override
+    public void removeByDocId(String kid, String docId) {
+        List<String> resultList = new ArrayList<>();
+        WeaviateClient client = getClient();
+        Field fieldId = Field.builder().name("uuid").build();
+        WhereFilter where = WhereFilter.builder()
+                .path(new String[]{"docId"})
+                .operator(Operator.Equal)
+                .valueString(docId)
+                .build();
+        Result<GraphQLResponse> result = client.graphQL().get()
+                .withClassName(className + kid)
+                .withFields(fieldId)
+                .withWhere(where)
+                .run();
+        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
+        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
+        ArrayList<LinkedTreeMap> m = l.get(className + kid);
+        for (LinkedTreeMap linkedTreeMap : m) {
+            String uuid = linkedTreeMap.get("uuid").toString();
+            resultList.add(uuid);
+        }
+        for (String uuid : resultList) {
+            Result<Boolean> deleteResult = client.data().deleter()
+                    .withID(uuid)
+                    .withClassName(className + kid)
+                    .withConsistencyLevel(ConsistencyLevel.ALL)  // default QUORUM
+                    .run();
+        }
+    }
+
+    @Override
+    public void removeByKid(String kid) {
+        WeaviateClient client = getClient();
+        Result<Boolean> result = client.schema().classDeleter().withClassName(className + kid).run();
+        if (result.hasErrors()) {
+            System.out.println("鍒犻櫎schema澶辫触" + result.getError());
+        } else {
+            System.out.println("鍒犻櫎schema鎴愬姛" + result.getResult());
+        }
+        log.info("drop schema by kid, result = {}", result);
+    }
+
+    @Override
+    public List<String> nearest(List<Double> queryVector, String kid) {
+        if (StringUtils.isBlank(kid)) {
+            return new ArrayList<String>();
+        }
+        List<String> resultList = new ArrayList<>();
+        Float[] vf = new Float[queryVector.size()];
+        for (int j = 0; j < queryVector.size(); j++) {
+            Double value = queryVector.get(j);
+            vf[j] = value.floatValue();
+        }
+        WeaviateClient client = getClient();
+        Field contentField = Field.builder().name("content").build();
+        Field _additional = Field.builder()
+                .name("_additional")
+                .fields(new Field[]{
+                        Field.builder().name("distance").build()
+                }).build();
+        NearVectorArgument nearVector = NearVectorArgument.builder()
+                .vector(vf)
+                .distance(1.6f) // certainty = 1f - distance /2f
+                .build();
+        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+        Result<GraphQLResponse> result = client.graphQL().get()
+                .withClassName(className + kid)
+                .withFields(contentField, _additional)
+                .withNearVector(nearVector)
+                .withLimit(knowledgeInfoVo.getRetrieveLimit())
+                .run();
+        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
+        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
+        ArrayList<LinkedTreeMap> m = l.get(className + kid);
+        for (LinkedTreeMap linkedTreeMap : m) {
+            String content = linkedTreeMap.get("content").toString();
+            resultList.add(content);
+        }
+        return resultList;
+    }
+
+    @Override
+    public List<String> nearest(String query, String kid) {
+        if (StringUtils.isBlank(kid)) {
+            return new ArrayList<String>();
+        }
+        List<String> resultList = new ArrayList<>();
+        WeaviateClient client = getClient();
+        Field contentField = Field.builder().name("content").build();
+        Field _additional = Field.builder()
+                .name("_additional")
+                .fields(new Field[]{
+                        Field.builder().name("distance").build()
+                }).build();
+        NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder()
+                .concepts(new String[]{query})
+                .distance(1.6f) // certainty = 1f - distance /2f
+                .build();
+        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+        Result<GraphQLResponse> result = client.graphQL().get()
+                .withClassName(className + kid)
+                .withFields(contentField, _additional)
+                .withNearText(nearText)
+                .withLimit(knowledgeInfoVo.getRetrieveLimit())
+                .run();
+        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
+        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
+        ArrayList<LinkedTreeMap> m = l.get(className + kid);
+        for (LinkedTreeMap linkedTreeMap : m) {
+            String content = linkedTreeMap.get("content").toString();
+            resultList.add(content);
+        }
+        return resultList;
+    }
+
+    public Result<Boolean> deleteSchema(String kid) {
+        WeaviateClient client = getClient();
+        Result<Boolean> result = client.schema().classDeleter().withClassName(className + kid).run();
+        if (result.hasErrors()) {
+            System.out.println(result.getError());
+        } else {
+            System.out.println(result.getResult());
+        }
+        return result;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-device/pom.xml b/ruoyi-modules/ruoyi-device/pom.xml
deleted file mode 100644
index ec4cbc4..0000000
--- a/ruoyi-modules/ruoyi-device/pom.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.ruoyi</groupId>
-        <artifactId>ruoyi-ai</artifactId>
-        <version>1.0.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>ruoyi-device</artifactId>
-
-    <properties>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-</project>
diff --git a/ruoyi-modules/ruoyi-knowledge/pom.xml b/ruoyi-modules/ruoyi-knowledge/pom.xml
deleted file mode 100644
index 46576f8..0000000
--- a/ruoyi-modules/ruoyi-knowledge/pom.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.ruoyi</groupId>
-        <artifactId>ruoyi-modules</artifactId>
-        <version>${revision}</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>ruoyi-knowledge</artifactId>
-
-    <properties>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-freemarker</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-validation</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-aop</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.webjars</groupId>
-            <artifactId>webjars-locator-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.webjars</groupId>
-            <artifactId>sockjs-client</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.webjars</groupId>
-            <artifactId>bootstrap</artifactId>
-            <version>3.3.7</version>
-        </dependency>
-        <dependency>
-            <groupId>org.webjars</groupId>
-            <artifactId>jquery</artifactId>
-            <version>3.1.1-1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mybatis.spring.boot</groupId>
-            <artifactId>mybatis-spring-boot-starter</artifactId>
-            <version>3.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.5.3</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.8.10</version>
-        </dependency>
-        <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
-            <version>4.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-devtools</artifactId>
-            <scope>runtime</scope>
-            <optional>true</optional>
-        </dependency>
-
-
-
-        <dependency>
-            <groupId>com.mysql</groupId>
-            <artifactId>mysql-connector-j</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.projectreactor.netty</groupId>
-            <artifactId>reactor-netty-core</artifactId>
-            <version>1.1.16</version>
-        </dependency>
-        <dependency>
-            <groupId>io.projectreactor.netty</groupId>
-            <artifactId>reactor-netty-http</artifactId>
-            <version>1.1.16</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <dependency>
-            <groupId>com.theokanning.openai-gpt3-java</groupId>
-            <artifactId>api</artifactId>
-            <version>0.18.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.theokanning.openai-gpt3-java</groupId>
-            <artifactId>client</artifactId>
-            <version>0.18.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.theokanning.openai-gpt3-java</groupId>
-            <artifactId>service</artifactId>
-            <version>0.18.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- 闃块噷JSON瑙f瀽鍣� -->
-        <dependency>
-            <groupId>com.alibaba.fastjson2</groupId>
-            <artifactId>fastjson2</artifactId>
-            <version>2.0.24</version>
-        </dependency>
-        <dependency>
-            <groupId>com.knuddels</groupId>
-            <artifactId>jtokkit</artifactId>
-            <version>0.5.0</version>
-        </dependency>
-        <dependency>
-            <groupId>io.weaviate</groupId>
-            <artifactId>client</artifactId>
-            <version>4.0.0</version>  <!-- Check latest version -->
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>3.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>3.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml-schemas</artifactId>
-            <version>3.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.pdfbox</groupId>
-            <artifactId>pdfbox</artifactId>
-            <version>2.0.27</version>
-        </dependency>
-        <dependency>
-            <groupId>com.squareup.retrofit2</groupId>
-            <artifactId>converter-jackson</artifactId>
-            <version>2.9.0</version>
-        </dependency>
-        <dependency>
-            <groupId>io.milvus</groupId>
-            <artifactId>milvus-sdk-java</artifactId>
-            <version>2.3.2</version>
-        </dependency>
-        <dependency>
-            <groupId>com.github.pagehelper</groupId>
-            <artifactId>pagehelper-spring-boot-starter</artifactId>
-            <version>1.4.6</version>
-        </dependency>
-        <dependency>
-            <groupId>com.belerweb</groupId>
-            <artifactId>pinyin4j</artifactId>
-            <version>2.5.1</version>
-        </dependency>
-
-
-        <dependency>
-            <groupId>org.ruoyi</groupId>
-            <artifactId>ruoyi-system</artifactId>
-        </dependency>
-
-
-    </dependencies>
-
-
-</project>
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/CodeFileLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/CodeFileLoader.java
deleted file mode 100644
index 5a74978..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/CodeFileLoader.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.chain.split.TextSplitter;
-import org.springframework.stereotype.Component;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class CodeFileLoader implements ResourceLoader{
-    private final TextSplitter textSplitter;
-    @Override
-    public String getContent(InputStream inputStream) {
-        StringBuffer stringBuffer = new StringBuffer();
-        try (InputStreamReader reader = new InputStreamReader(inputStream);
-             BufferedReader bufferedReader = new BufferedReader(reader)){
-            String line;
-            while ((line = bufferedReader.readLine()) != null) {
-                stringBuffer.append(line).append("\n");
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return stringBuffer.toString();
-    }
-    @Override
-    public List<String> getChunkList(String content, String kid){
-        return textSplitter.split(content, kid);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/CsvFileLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/CsvFileLoader.java
deleted file mode 100644
index cec04fe..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/CsvFileLoader.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import java.io.InputStream;
-import java.util.List;
-
-public class CsvFileLoader implements ResourceLoader{
-    @Override
-    public String getContent(InputStream inputStream) {
-        return null;
-    }
-
-    @Override
-    public List<String> getChunkList(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/FolderLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/FolderLoader.java
deleted file mode 100644
index 1bbbc7c..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/FolderLoader.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import java.io.InputStream;
-import java.util.List;
-
-public class FolderLoader implements ResourceLoader{
-    @Override
-    public String getContent(InputStream inputStream) {
-        return null;
-    }
-
-    @Override
-    public List<String> getChunkList(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/GithubLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/GithubLoader.java
deleted file mode 100644
index dd6b449..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/GithubLoader.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import java.io.InputStream;
-import java.util.List;
-
-public class GithubLoader implements ResourceLoader{
-    @Override
-    public String getContent(InputStream inputStream) {
-        return null;
-    }
-
-    @Override
-    public List<String> getChunkList(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/JsonFileLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/JsonFileLoader.java
deleted file mode 100644
index 5c69389..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/JsonFileLoader.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import java.io.InputStream;
-import java.util.List;
-
-public class JsonFileLoader implements ResourceLoader{
-    @Override
-    public String getContent(InputStream inputStream) {
-        return null;
-    }
-
-    @Override
-    public List<String> getChunkList(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/MarkDownFileLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/MarkDownFileLoader.java
deleted file mode 100644
index 24d43ff..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/MarkDownFileLoader.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.chain.split.TextSplitter;
-import org.springframework.stereotype.Component;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class MarkDownFileLoader implements ResourceLoader{
-    private final TextSplitter textSplitter;
-    @Override
-    public String getContent(InputStream inputStream) {
-        StringBuffer stringBuffer = new StringBuffer();
-        try (InputStreamReader reader = new InputStreamReader(inputStream);
-             BufferedReader bufferedReader = new BufferedReader(reader)){
-            String line;
-            while ((line = bufferedReader.readLine()) != null) {
-                stringBuffer.append(line).append("\n");
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return stringBuffer.toString();
-    }
-    @Override
-    public List<String> getChunkList(String content, String kid){
-        return textSplitter.split(content, kid);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/PdfFileLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/PdfFileLoader.java
deleted file mode 100644
index 0acf355..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/PdfFileLoader.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import lombok.AllArgsConstructor;
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.text.PDFTextStripper;
-import org.ruoyi.knowledge.chain.split.TextSplitter;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-public class PdfFileLoader implements ResourceLoader{
-    private final TextSplitter characterTextSplitter;
-    @Override
-    public String getContent(InputStream inputStream) {
-        PDDocument document = null;
-        try {
-            document = PDDocument.load(inputStream);
-            PDFTextStripper textStripper = new PDFTextStripper();
-            String content = textStripper.getText(document);
-            return content;
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public List<String> getChunkList(String content, String kid) {
-        return characterTextSplitter.split(content, kid);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/ResourceLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/ResourceLoader.java
deleted file mode 100644
index 9ef4b11..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/ResourceLoader.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * 璧勬簮杞藉叆
- */
-public interface ResourceLoader {
-
-    String getContent(InputStream inputStream);
-
-    List<String> getChunkList(String content, String kid);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/ResourceLoaderFactory.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/ResourceLoaderFactory.java
deleted file mode 100644
index 6a29b25..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/ResourceLoaderFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import lombok.AllArgsConstructor;
-import org.ruoyi.knowledge.chain.split.CharacterTextSplitter;
-import org.ruoyi.knowledge.chain.split.CodeTextSplitter;
-import org.ruoyi.knowledge.chain.split.MarkdownTextSplitter;
-import org.ruoyi.knowledge.chain.split.TokenTextSplitter;
-import org.ruoyi.knowledge.constant.FileType;
-import org.springframework.stereotype.Component;
-
-@AllArgsConstructor
-@Component
-public class ResourceLoaderFactory {
-    private final CharacterTextSplitter characterTextSplitter;
-    private final CodeTextSplitter codeTextSplitter;
-    private final MarkdownTextSplitter markdownTextSplitter;
-    private final TokenTextSplitter tokenTextSplitter;
-    public ResourceLoader getLoaderByFileType(String fileType){
-        if (FileType.isTextFile(fileType)){
-            return new TextFileLoader(characterTextSplitter);
-        } else if (FileType.isWord(fileType)) {
-            return new WordLoader(characterTextSplitter);
-        } else if (FileType.isPdf(fileType)) {
-            return new PdfFileLoader(characterTextSplitter);
-        } else if (FileType.isMdFile(fileType)) {
-            return new MarkDownFileLoader(markdownTextSplitter);
-        }else if (FileType.isCodeFile(fileType)) {
-            return new CodeFileLoader(codeTextSplitter);
-        }else {
-            return new TextFileLoader(characterTextSplitter);
-        }
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/TextFileLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/TextFileLoader.java
deleted file mode 100644
index 95b8929..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/TextFileLoader.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.chain.split.TextSplitter;
-import org.springframework.stereotype.Component;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class TextFileLoader implements ResourceLoader{
-    private final TextSplitter textSplitter;
-    @Override
-    public String getContent(InputStream inputStream) {
-        StringBuffer stringBuffer = new StringBuffer();
-        try (InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
-             BufferedReader bufferedReader = new BufferedReader(reader)){
-            String line;
-            while ((line = bufferedReader.readLine()) != null) {
-                stringBuffer.append(line).append("\n");
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return stringBuffer.toString();
-    }
-    @Override
-    public List<String> getChunkList(String content, String kid){
-        return textSplitter.split(content, kid);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/WordLoader.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/WordLoader.java
deleted file mode 100644
index c31b9e6..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/loader/WordLoader.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.ruoyi.knowledge.chain.loader;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
-import org.apache.poi.xwpf.usermodel.XWPFDocument;
-import org.ruoyi.knowledge.chain.split.TextSplitter;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class WordLoader implements ResourceLoader{
-    private final TextSplitter textSplitter;
-    @Override
-    public String getContent(InputStream inputStream) {
-        XWPFDocument document = null;
-        try {
-            document = new XWPFDocument(inputStream);
-            XWPFWordExtractor extractor = new XWPFWordExtractor(document);
-            String content = extractor.getText();
-            return content;
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public List<String> getChunkList(String content, String kid) {
-        return textSplitter.split(content, kid);
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/CharacterTextSplitter.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/CharacterTextSplitter.java
deleted file mode 100644
index 4b8f4af..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/CharacterTextSplitter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.knowledge.chain.split;
-
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@Component
-@Slf4j
-@Primary
-public class CharacterTextSplitter implements TextSplitter {
-
-    @Lazy
-    @Resource
-    private IKnowledgeInfoService knowledgeInfoService;
-
-    @Override
-    public List<String> split(String content, String kid) {
-        // 浠庣煡璇嗗簱琛ㄤ腑鑾峰彇閰嶇疆
-        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
-        String knowledgeSeparator = knowledgeInfoVo.getKnowledgeSeparator();
-        int textBlockSize = knowledgeInfoVo.getTextBlockSize();
-        int overlapChar = knowledgeInfoVo.getOverlapChar();
-        List<String> chunkList = new ArrayList<>();
-        if (content.contains(knowledgeSeparator) && StringUtils.isNotBlank(knowledgeSeparator)) {
-            // 鎸夎嚜瀹氫箟鍒嗛殧绗﹀垏鍒�
-            String[] chunks = content.split(knowledgeSeparator);
-            chunkList.addAll(Arrays.asList(chunks));
-        } else {
-            int indexMin = 0;
-            int len = content.length();
-            int i = 0;
-            int right = 0;
-            while (true) {
-                if (len > right) {
-                    int begin = i * textBlockSize - overlapChar;
-                    if (begin < indexMin) {
-                        begin = indexMin;
-                    }
-                    int end = textBlockSize * (i + 1) + overlapChar;
-                    if (end > len) {
-                        end = len;
-                    }
-                    String chunk = content.substring(begin, end);
-                    chunkList.add(chunk);
-                    i++;
-                    right = right + textBlockSize;
-                } else {
-                    break;
-                }
-            }
-        }
-        return chunkList;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/CodeTextSplitter.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/CodeTextSplitter.java
deleted file mode 100644
index 209f5de..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/CodeTextSplitter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.ruoyi.knowledge.chain.split;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class CodeTextSplitter implements TextSplitter{
-    @Override
-    public List<String> split(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/MarkdownTextSplitter.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/MarkdownTextSplitter.java
deleted file mode 100644
index 89ea653..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/MarkdownTextSplitter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.ruoyi.knowledge.chain.split;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class MarkdownTextSplitter implements TextSplitter{
-    @Override
-    public List<String> split(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/TextSplitter.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/TextSplitter.java
deleted file mode 100644
index 86b3aaf..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/TextSplitter.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.ruoyi.knowledge.chain.split;
-
-import java.util.List;
-
-/**
- * 鏂囨湰鍒囧垎
- */
-public interface TextSplitter {
-
-    /**
-     * 鏂囨湰鍒囧垎
-     *
-     * @param content 鏂囨湰鍐呭
-     * @param kid     鐭ヨ瘑搴搃d
-     * @return 鍒囧垎鍚庣殑鏂囨湰鍒楄〃
-     */
-    List<String> split(String content, String kid);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/TokenTextSplitter.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/TokenTextSplitter.java
deleted file mode 100644
index 696f261..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/split/TokenTextSplitter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.ruoyi.knowledge.chain.split;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class TokenTextSplitter implements TextSplitter{
-    @Override
-    public List<String> split(String content, String kid) {
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java
deleted file mode 100644
index 840b62f..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import com.google.gson.Gson;
-import io.github.ollama4j.OllamaAPI;
-import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
-import jakarta.annotation.Resource;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-@Component
-@Slf4j
-@RequiredArgsConstructor
-public class BgeLargeVectorization implements Vectorization {
-
-    String host = "http://localhost:11434/";
-
-    @Lazy
-    @Resource
-    private IKnowledgeInfoService knowledgeInfoService;
-
-    @Override
-    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
-        OllamaAPI ollamaAPI = new OllamaAPI(host);
-        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
-        List<Double> doubleVector;
-        try {
-            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), new Gson().toJson(chunkList)));
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        List<List<Double>> vectorList = new ArrayList<>();
-        vectorList.add(doubleVector);
-        return vectorList;
-    }
-
-    @Override
-    public List<Double> singleVectorization(String chunk, String kid) {
-        List<String> chunkList = new ArrayList<>();
-        chunkList.add(chunk);
-        List<List<Double>> vectorList = batchVectorization(chunkList, kid);
-        return vectorList.get(0);
-    }
-
-    public static void main(String[] args) {
-        OllamaAPI ollamaAPI = new OllamaAPI("http://localhost:11434/");
-        List<String> chunkList = Arrays.asList("澶╁緢钃�", "娴峰緢娣�");
-        List<Double> doubleVector;
-        try {
-            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel("quentinz/bge-large-zh-v1.5", new Gson().toJson(chunkList)));
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        System.out.println("=== " + doubleVector + " 1===");
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/LocalModelsVectorization.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/LocalModelsVectorization.java
deleted file mode 100644
index 306d823..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/LocalModelsVectorization.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-import jakarta.annotation.Resource;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.common.chat.config.ChatConfig;
-import org.ruoyi.common.chat.localModels.LocalModelsofitClient;
-import org.ruoyi.common.chat.openai.OpenAiStreamClient;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Component
-@Slf4j
-@RequiredArgsConstructor
-public class LocalModelsVectorization   {
-    @Resource
-    private IKnowledgeInfoService knowledgeInfoService;
-
-    @Resource
-    private LocalModelsofitClient localModelsofitClient;
-
-    @Getter
-    private OpenAiStreamClient openAiStreamClient;
-
-    private final ChatConfig chatConfig;
-
-    /**
-     * 鎵归噺鍚戦噺鍖�
-     *
-     * @param chunkList 鏂囨湰鍧楀垪琛�
-     * @param kid 鐭ヨ瘑 ID
-     * @return 鍚戦噺鍖栫粨鏋�
-     */
-
-    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
-        logVectorizationRequest(kid, chunkList);  // 鍦ㄥ悜閲忓寲寮�濮嬪墠璁板綍鏃ュ織
-        openAiStreamClient = chatConfig.getOpenAiStreamClient(); // 鑾峰彇 OpenAi 瀹㈡埛绔�
-        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid)); // 鏌ヨ鐭ヨ瘑淇℃伅
-        // 璋冪敤 localModelsofitClient 鑾峰彇 Top K 宓屽叆鍚戦噺
-        try {
-            return localModelsofitClient.getTopKEmbeddings(
-                    chunkList,
-                    knowledgeInfoVo.getVectorModel(),
-                    knowledgeInfoVo.getKnowledgeSeparator(),
-                    knowledgeInfoVo.getRetrieveLimit(),
-                    knowledgeInfoVo.getTextBlockSize(),
-                    knowledgeInfoVo.getOverlapChar()
-            );
-        } catch (Exception e) {
-            log.error("Failed to perform batch vectorization for knowledgeId: {}", kid, e);
-            throw new RuntimeException("Batch vectorization failed", e);
-        }
-    }
-
-    /**
-     * 鍗曚竴鏂囨湰鍧楀悜閲忓寲
-     *
-     * @param chunk 鍗曚竴鏂囨湰鍧�
-     * @param kid 鐭ヨ瘑 ID
-     * @return 鍚戦噺鍖栫粨鏋�
-     */
-
-    public List<Double> singleVectorization(String chunk, String kid) {
-        List<String> chunkList = new ArrayList<>();
-        chunkList.add(chunk);
-
-        // 璋冪敤鎵归噺鍚戦噺鍖栨柟娉�
-        List<List<Double>> vectorList = batchVectorization(chunkList, kid);
-
-        if (vectorList.isEmpty()) {
-            log.warn("Vectorization returned empty list for chunk: {}", chunk);
-            return new ArrayList<>();
-        }
-
-        return vectorList.get(0); // 杩斿洖绗竴涓悜閲�
-    }
-
-    /**
-     * 鎻愪緵鏇寸畝娲佺殑鏃ュ織璁板綍鏂规硶
-     *
-     * @param kid 鐭ヨ瘑 ID
-     * @param chunkList 鏂囨湰鍧楀垪琛�
-     */
-    private void logVectorizationRequest(String kid, List<String> chunkList) {
-        log.info("Starting vectorization for Knowledge ID: {} with {} chunks.", kid, chunkList.size());
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/OpenAiVectorization.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/OpenAiVectorization.java
deleted file mode 100644
index bc82dbf..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/OpenAiVectorization.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-import jakarta.annotation.Resource;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.common.chat.config.ChatConfig;
-import org.ruoyi.common.chat.entity.embeddings.Embedding;
-
-import org.ruoyi.common.chat.entity.embeddings.EmbeddingResponse;
-import org.ruoyi.common.chat.openai.OpenAiStreamClient;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.ruoyi.system.domain.SysModel;
-import org.ruoyi.system.service.ISysModelService;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@Component
-@Slf4j
-@RequiredArgsConstructor
-public class OpenAiVectorization implements Vectorization {
-
-    @Lazy
-    @Resource
-    private IKnowledgeInfoService knowledgeInfoService;
-    @Lazy
-    @Resource
-    private LocalModelsVectorization localModelsVectorization;
-    @Lazy
-    @Resource
-    private ISysModelService sysModelService;
-
-    @Getter
-    private OpenAiStreamClient openAiStreamClient;
-
-    private final ChatConfig chatConfig;
-
-    @Override
-    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
-        List<List<Double>> vectorList;
-        // 鑾峰彇鐭ヨ瘑搴撲俊鎭�
-        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
-        if(knowledgeInfoVo == null){
-            log.warn("鐭ヨ瘑搴撲笉瀛樺湪:璇锋煡妫�ID {}",kid);
-            vectorList=new ArrayList<>();
-            vectorList.add(new ArrayList<>());
-            return vectorList;
-        }
-        SysModel sysModel = sysModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
-        String apiHost= sysModel.getApiHost();
-        String apiKey= sysModel.getApiKey();
-        openAiStreamClient = chatConfig.createOpenAiStreamClient(apiHost,apiKey);
-
-        Embedding embedding = buildEmbedding(chunkList, knowledgeInfoVo);
-        EmbeddingResponse embeddings = openAiStreamClient.embeddings(embedding);
-
-        // 澶勭悊 OpenAI 杩斿洖鐨勫祵鍏ユ暟鎹�
-        vectorList = processOpenAiEmbeddings(embeddings);
-
-        return vectorList;
-    }
-
-    /**
-     * 鏋勫缓 Embedding 瀵硅薄
-     */
-    private Embedding buildEmbedding(List<String> chunkList, KnowledgeInfoVo knowledgeInfoVo) {
-        return Embedding.builder()
-                .input(chunkList)
-                .model(knowledgeInfoVo.getVectorModel())
-                .build();
-    }
-
-    /**
-     * 澶勭悊 OpenAI 杩斿洖鐨勫祵鍏ユ暟鎹�
-     */
-    private List<List<Double>> processOpenAiEmbeddings(EmbeddingResponse embeddings) {
-        List<List<Double>> vectorList = new ArrayList<>();
-
-        embeddings.getData().forEach(data -> {
-            List<BigDecimal> vector = data.getEmbedding();
-            List<Double> doubleVector = convertToDoubleList(vector);
-            vectorList.add(doubleVector);
-        });
-
-        return vectorList;
-    }
-
-    /**
-     * 灏� BigDecimal 杞崲涓� Double 鍒楄〃
-     */
-    private List<Double> convertToDoubleList(List<BigDecimal> vector) {
-        return vector.stream()
-                .map(BigDecimal::doubleValue)
-                .collect(Collectors.toList());
-    }
-
-
-    @Override
-    public List<Double> singleVectorization(String chunk, String kid) {
-        List<String> chunkList = new ArrayList<>();
-        chunkList.add(chunk);
-        List<List<Double>> vectorList = batchVectorization(chunkList, kid);
-        return vectorList.get(0);
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/Vectorization.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/Vectorization.java
deleted file mode 100644
index 1c25dde..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/Vectorization.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-import java.util.List;
-
-/**
- * 鍚戦噺鍖�
- */
-public interface Vectorization {
-    List<List<Double>> batchVectorization(List<String> chunkList, String kid);
-
-    List<Double> singleVectorization(String chunk, String kid);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java
deleted file mode 100644
index 87a09b7..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-import cn.hutool.core.util.StrUtil;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-/**
- * 鏂囨湰鍚戦噺鍖�
- * @author huangkh
- */
-@Component
-@Slf4j
-public class VectorizationFactory {
-
-    private final OpenAiVectorization openAiVectorization;
-
-    private final BgeLargeVectorization bgeLargeVectorization;
-
-    @Lazy
-    @Resource
-    private IKnowledgeInfoService knowledgeInfoService;
-
-    public VectorizationFactory(OpenAiVectorization openAiVectorization,BgeLargeVectorization bgeLargeVectorization) {
-        this.openAiVectorization = openAiVectorization;
-        this.bgeLargeVectorization = bgeLargeVectorization;
-    }
-
-    public Vectorization getEmbedding(String kid){
-        String vectorModel = "text-embedding-3-small";
-        if (StrUtil.isNotEmpty(kid)) {
-            KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
-            if (knowledgeInfoVo != null && StrUtil.isNotEmpty(knowledgeInfoVo.getVectorModel())) {
-                vectorModel = knowledgeInfoVo.getVectorModel();
-            }
-        }
-        return switch (vectorModel) {
-            case "quentinz/bge-large-zh-v1.5" -> bgeLargeVectorization;
-            default -> openAiVectorization;
-        };
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationType.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationType.java
deleted file mode 100644
index a9d370d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationType.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-public enum VectorizationType {
-    OPENAI,    // OpenAI 鍚戦噺鍖�
-    LOCAL;     // 鏈湴妯″瀷鍚戦噺鍖�
-
-    public static VectorizationType fromString(String type) {
-        for (VectorizationType v : values()) {
-            if (v.name().equalsIgnoreCase(type)) {
-                return v;
-            }
-        }
-        throw new IllegalArgumentException("Unknown VectorizationType: " + type);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java
deleted file mode 100644
index e25d331..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorizer;
-
-import jakarta.annotation.Resource;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-@Component
-@Slf4j
-@Primary
-@AllArgsConstructor
-public class VectorizationWrapper implements Vectorization{
-
-    private final VectorizationFactory vectorizationFactory;
-    @Override
-    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
-        Vectorization embedding = vectorizationFactory.getEmbedding(kid);
-        return embedding.batchVectorization(chunkList, kid);
-    }
-
-    @Override
-    public List<Double> singleVectorization(String chunk, String kid) {
-        Vectorization embedding = vectorizationFactory.getEmbedding(kid);
-        return embedding.singleVectorization(chunk, kid);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java
deleted file mode 100644
index 32e6216..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/MilvusVectorStore.java
+++ /dev/null
@@ -1,396 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorstore;
-
-import io.milvus.client.MilvusServiceClient;
-import io.milvus.grpc.DataType;
-import io.milvus.grpc.DescribeIndexResponse;
-import io.milvus.grpc.MutationResult;
-import io.milvus.grpc.SearchResults;
-import io.milvus.param.*;
-import io.milvus.param.collection.*;
-import io.milvus.param.dml.DeleteParam;
-import io.milvus.param.dml.InsertParam;
-import io.milvus.param.dml.SearchParam;
-import io.milvus.param.index.CreateIndexParam;
-import io.milvus.param.index.DescribeIndexParam;
-import io.milvus.param.partition.CreatePartitionParam;
-import io.milvus.response.QueryResultsWrapper;
-import io.milvus.response.SearchResultsWrapper;
-import jakarta.annotation.PostConstruct;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.ruoyi.common.core.service.ConfigService;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@Service
-@Slf4j
-public class MilvusVectorStore implements VectorStore {
-
-    private volatile Integer dimension;
-    private volatile String collectionName;
-    private MilvusServiceClient milvusServiceClient;
-
-    @Resource
-    private ConfigService configService;
-
-    @PostConstruct
-    public void loadConfig() {
-        this.dimension = Integer.parseInt(configService.getConfigValue("milvus", "dimension"));
-        this.collectionName = configService.getConfigValue("milvus", "collection");
-    }
-
-    @PostConstruct
-    public void init() {
-        String milvusHost = configService.getConfigValue("milvus", "host");
-        String milvausPort = configService.getConfigValue("milvus", "port");
-        milvusServiceClient = new MilvusServiceClient(
-                ConnectParam.newBuilder()
-                        .withHost(milvusHost)
-                        .withPort(Integer.parseInt(milvausPort))
-                        .withDatabaseName("default")
-                        .build()
-        );
-    }
-
-    private void createSchema(String kid) {
-        FieldType primaryField = FieldType.newBuilder()
-                .withName("row_id")
-                .withDataType(DataType.Int64)
-                .withPrimaryKey(true)
-                .withAutoID(true)
-                .build();
-        FieldType contentField = FieldType.newBuilder()
-                .withName("content")
-                .withDataType(DataType.VarChar)
-                .withMaxLength(1000)
-                .build();
-        FieldType kidField = FieldType.newBuilder()
-                .withName("kid")
-                .withDataType(DataType.VarChar)
-                .withMaxLength(20)
-                .build();
-        FieldType docIdField = FieldType.newBuilder()
-                .withName("docId")
-                .withDataType(DataType.VarChar)
-                .withMaxLength(20)
-                .build();
-        FieldType fidField = FieldType.newBuilder()
-                .withName("fid")
-                .withDataType(DataType.VarChar)
-                .withMaxLength(20)
-                .build();
-        FieldType vectorField = FieldType.newBuilder()
-                .withName("fv")
-                .withDataType(DataType.FloatVector)
-                .withDimension(dimension)
-                .build();
-        CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder()
-                .withCollectionName(collectionName + kid)
-                .withDescription("local knowledge")
-                .addFieldType(primaryField)
-                .addFieldType(contentField)
-                .addFieldType(kidField)
-                .addFieldType(docIdField)
-                .addFieldType(fidField)
-                .addFieldType(vectorField)
-                .build();
-        milvusServiceClient.createCollection(createCollectionReq);
-
-        // 鍒涘缓鍚戦噺鐨勭储寮�
-        IndexType INDEX_TYPE = IndexType.IVF_FLAT;
-        String INDEX_PARAM = "{\"nlist\":1024}";
-        milvusServiceClient.createIndex(
-                CreateIndexParam.newBuilder()
-                        .withCollectionName(collectionName + kid)
-                        .withFieldName("fv")
-                        .withIndexType(INDEX_TYPE)
-                        .withMetricType(MetricType.IP)
-                        .withExtraParam(INDEX_PARAM)
-                        .withSyncMode(Boolean.FALSE)
-                        .build()
-        );
-
-    }
-
-    @Override
-    public void newSchema(String kid) {
-        createSchema(kid);
-    }
-
-    @Override
-    public void removeByKidAndFid(String kid, String fid) {
-        milvusServiceClient.delete(
-                DeleteParam.newBuilder()
-                        .withCollectionName(collectionName + kid)
-                        .withExpr("fid == " + fid)
-                        .build()
-        );
-    }
-
-    @Override
-    public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
-        String fullCollectionName = collectionName + kid;
-
-        // 妫�鏌ラ泦鍚堟槸鍚﹀瓨鍦�
-        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder()
-                .withCollectionName(fullCollectionName)
-                .build();
-        R<Boolean> booleanR = milvusServiceClient.hasCollection(hasCollectionParam);
-
-        if (booleanR.getStatus() == R.Status.Success.getCode()) {
-            boolean collectionExists = booleanR.getData().booleanValue();
-            if (!collectionExists) {
-                // 闆嗗悎涓嶅瓨鍦紝鍒涘缓闆嗗悎
-                List<FieldType> fieldTypes = new ArrayList<>();
-                // 鍋囪杩欓噷瀹氫箟 id 瀛楁锛屾牴鎹疄闄呮儏鍐典慨鏀�
-                FieldType idField = FieldType.newBuilder()
-                        .withName("id")
-                        .withDataType(DataType.Int64)
-                        .withPrimaryKey(true)
-                        .withAutoID(true)
-                        .build();
-                fieldTypes.add(idField);
-
-                // 瀹氫箟鍚戦噺瀛楁
-                FieldType vectorField = FieldType.newBuilder()
-                        .withName("fv")
-                        .withDataType(DataType.FloatVector)
-                        .withDimension(vectorList.get(0).size())
-                        .build();
-                fieldTypes.add(vectorField);
-
-                // 瀹氫箟鍏朵粬瀛楁
-                FieldType contentField = FieldType.newBuilder()
-                        .withName("content")
-                        .withDataType(DataType.VarChar)
-                        .withMaxLength(chunkList.size() * 1024) // 鏍规嵁瀹為檯鎯呭喌淇敼
-                        .build();
-                fieldTypes.add(contentField);
-
-                FieldType kidField = FieldType.newBuilder()
-                        .withName("kid")
-                        .withDataType(DataType.VarChar)
-                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
-                        .build();
-                fieldTypes.add(kidField);
-
-                FieldType docIdField = FieldType.newBuilder()
-                        .withName("docId")
-                        .withDataType(DataType.VarChar)
-                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
-                        .build();
-                fieldTypes.add(docIdField);
-
-                FieldType fidField = FieldType.newBuilder()
-                        .withName("fid")
-                        .withDataType(DataType.VarChar)
-                        .withMaxLength(256) // 鏍规嵁瀹為檯鎯呭喌淇敼
-                        .build();
-                fieldTypes.add(fidField);
-
-                CreateCollectionParam createCollectionParam = CreateCollectionParam.newBuilder()
-                        .withCollectionName(fullCollectionName)
-                        .withFieldTypes(fieldTypes)
-                        .build();
-
-                R<RpcStatus> collection = milvusServiceClient.createCollection(createCollectionParam);
-                if (collection.getStatus() == R.Status.Success.getCode()) {
-                    System.out.println("闆嗗悎 " + fullCollectionName + " 鍒涘缓鎴愬姛");
-
-                    // 鍒涘缓绱㈠紩
-                    CreateIndexParam createIndexParam = CreateIndexParam.newBuilder()
-                            .withCollectionName(fullCollectionName)
-                            .withFieldName("fv") // 鍚戦噺瀛楁鍚�
-                            .withIndexType(IndexType.IVF_FLAT) // 绱㈠紩绫诲瀷
-                            .withMetricType(MetricType.IP)
-                            .withExtraParam("{\"nlist\":1024}") // 绱㈠紩鍙傛暟
-                            .build();
-                    R<RpcStatus> indexResponse = milvusServiceClient.createIndex(createIndexParam);
-                    if (indexResponse.getStatus() == R.Status.Success.getCode()) {
-                        System.out.println("绱㈠紩鍒涘缓鎴愬姛");
-                    } else {
-                        System.err.println("绱㈠紩鍒涘缓澶辫触: " + indexResponse.getMessage());
-                        return;
-                    }
-                } else {
-                    System.err.println("闆嗗悎鍒涘缓澶辫触: " + collection.getMessage());
-                    return;
-                }
-            }
-        } else {
-            System.err.println("妫�鏌ラ泦鍚堟槸鍚﹀瓨鍦ㄦ椂鍑洪敊: " + booleanR.getMessage());
-            return;
-        }
-
-        if (StringUtils.isNotBlank(docId)) {
-            milvusServiceClient.createPartition(
-                    CreatePartitionParam.newBuilder()
-                            .withCollectionName(fullCollectionName)
-                            .withPartitionName(docId)
-                            .build()
-            );
-        }
-
-        List<List<Float>> vectorFloatList = new ArrayList<>();
-        List<String> kidList = new ArrayList<>();
-        List<String> docIdList = new ArrayList<>();
-        for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) {
-            List<Double> vector = vectorList.get(i);
-            List<Float> vfList = new ArrayList<>();
-            for (int j = 0; j < vector.size(); j++) {
-                Double value = vector.get(j);
-                vfList.add(value.floatValue());
-            }
-            vectorFloatList.add(vfList);
-            kidList.add(kid);
-            docIdList.add(docId);
-        }
-        List<InsertParam.Field> fields = new ArrayList<>();
-        fields.add(new InsertParam.Field("content", chunkList));
-        fields.add(new InsertParam.Field("kid", kidList));
-        fields.add(new InsertParam.Field("docId", docIdList));
-        fields.add(new InsertParam.Field("fid", fidList));
-        fields.add(new InsertParam.Field("fv", vectorFloatList));
-
-        InsertParam insertParam = InsertParam.newBuilder()
-                .withCollectionName(fullCollectionName)
-                .withPartitionName(docId)
-                .withFields(fields)
-                .build();
-        System.out.println("=========================");
-
-        R<MutationResult> insert = milvusServiceClient.insert(insertParam);
-        if (insert.getStatus() == R.Status.Success.getCode()) {
-            System.out.println("鎻掑叆鎴愬姛锛屾彃鍏ョ殑琛屾暟: " + insert.getData().getInsertCnt());
-        } else {
-            System.err.println("鎻掑叆澶辫触: " + insert.getMessage());
-        }
-        System.out.println("=========================");
-        // milvus鍦ㄥ皢鏁版嵁瑁呰浇鍒板唴瀛樺悗鎵嶈兘杩涜鍚戦噺璁$畻.
-        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
-                .withCollectionName(fullCollectionName)
-                .build();
-        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
-        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
-            System.err.println("鍔犺浇闆嗗悎 " + fullCollectionName + " 鍒板唴瀛樻椂鍑洪敊锛�" + loadResponse.getMessage());
-        }
-//        milvusServiceClient.loadCollection(LoadCollectionParam.newBuilder().withCollectionName(fullCollectionName).build());
-    }
-
-
-    @Override
-    public void removeByDocId(String kid, String docId) {
-        milvusServiceClient.delete(
-                DeleteParam.newBuilder()
-                        .withCollectionName(collectionName + kid)
-                        .withExpr("1 == 1")
-                        .withPartitionName(docId)
-                        .build()
-        );
-    }
-
-    @Override
-    public void removeByKid(String kid) {
-        milvusServiceClient.dropCollection(
-                DropCollectionParam.newBuilder()
-                        .withCollectionName(collectionName + kid)
-                        .build()
-        );
-    }
-
-    @Override
-    public List<String> nearest(List<Double> queryVector, String kid) {
-        String fullCollectionName = collectionName + kid;
-
-        HasCollectionParam hasCollectionParam = HasCollectionParam.newBuilder()
-                .withCollectionName(fullCollectionName)
-                .build();
-
-        R<Boolean> booleanR = milvusServiceClient.hasCollection(hasCollectionParam);
-        if (booleanR.getStatus() != R.Status.Success.getCode() || !booleanR.getData().booleanValue()) {
-            System.err.println("闆嗗悎 " + fullCollectionName + " 涓嶅瓨鍦ㄦ垨妫�鏌ラ泦鍚堝瓨鍦ㄦ�ф椂鍑洪敊銆�");
-            return new ArrayList<>();
-        }
-
-        DescribeIndexParam describeIndexParam = DescribeIndexParam.newBuilder().withCollectionName(fullCollectionName).build();
-
-        R<DescribeIndexResponse> describeIndexResponseR = milvusServiceClient.describeIndex(describeIndexParam);
-
-        if (describeIndexResponseR.getStatus() == R.Status.Success.getCode()) {
-            System.out.println("绱㈠紩淇℃伅: " + describeIndexResponseR.getData().getIndexDescriptionsCount());
-        } else {
-            System.err.println("鑾峰彇绱㈠紩澶辫触: " + describeIndexResponseR.getMessage());
-        }
-
-//        // 鍔犺浇闆嗗悎鍒板唴瀛�
-//        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
-//                .withCollectionName(fullCollectionName)
-//                .build();
-//        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
-//        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
-//            System.err.println("鍔犺浇闆嗗悎 " + fullCollectionName + " 鍒板唴瀛樻椂鍑洪敊锛�" + loadResponse.getMessage());
-//            return new ArrayList<>();
-//        }
-
-        List<String> search_output_fields = Arrays.asList("content", "fv");
-        List<Float> fv = new ArrayList<>();
-        for (int i = 0; i < queryVector.size(); i++) {
-            fv.add(queryVector.get(i).floatValue());
-        }
-        List<List<Float>> vectors = new ArrayList<>();
-        vectors.add(fv);
-        String search_param = "{\"nprobe\":10, \"offset\":0}";
-        SearchParam searchParam = SearchParam.newBuilder()
-                .withCollectionName(collectionName + kid)
-                .withMetricType(MetricType.IP)
-                .withOutFields(search_output_fields)
-                .withTopK(10)
-                .withVectors(vectors)
-                .withVectorFieldName("fv")
-                .withParams(search_param)
-                .build();
-        System.out.println("SearchParam: " + searchParam.toString());
-        R<SearchResults> respSearch = milvusServiceClient.search(searchParam);
-        if (respSearch.getStatus() == R.Status.Success.getCode()) {
-            SearchResults searchResults = respSearch.getData();
-            if (searchResults != null) {
-                System.out.println(searchResults.getResults());
-                SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(searchResults.getResults());
-                List<QueryResultsWrapper.RowRecord> rowRecords = wrapperSearch.getRowRecords();
-
-                List<String> resultList = new ArrayList<>();
-                if (rowRecords != null && !rowRecords.isEmpty()) {
-                    for (QueryResultsWrapper.RowRecord rowRecord : rowRecords) {
-                        String content = rowRecord.get("content").toString();
-                        resultList.add(content);
-                    }
-                }
-                return resultList;
-            } else {
-                System.err.println("鎼滅储缁撴灉涓虹┖");
-            }
-        } else {
-            System.err.println("鎼滅储鎿嶄綔澶辫触: " + respSearch.getMessage());
-        }
-        return new ArrayList<>();
-
-    }
-
-    /**
-     * milvus 涓嶆敮鎸侀�氳繃鏂囨湰妫�绱㈢浉浼兼��
-     *
-     * @param query
-     * @param kid
-     * @return
-     */
-    @Override
-    public List<String> nearest(String query, String kid) {
-        return null;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStore.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStore.java
deleted file mode 100644
index 6be022d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStore.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorstore;
-
-import java.util.List;
-
-/**
- * 鍚戦噺瀛樺偍
- */
-public interface VectorStore {
-
-    void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList);
-
-    void removeByDocId(String kid, String docId);
-
-    void removeByKid(String kid);
-
-    List<String> nearest(List<Double> queryVector, String kid);
-
-    List<String> nearest(String query, String kid);
-
-    void newSchema(String kid);
-
-    void removeByKidAndFid(String kid, String fid);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStoreFactory.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStoreFactory.java
deleted file mode 100644
index 4471fca..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStoreFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorstore;
-
-import cn.hutool.core.util.StrUtil;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.mapper.KnowledgeInfoMapper;
-import org.springframework.stereotype.Component;
-
-@Component
-@Slf4j
-public class VectorStoreFactory {
-
-    private final WeaviateVectorStore weaviateVectorStore;
-
-    private final MilvusVectorStore milvusVectorStore;
-
-    @Resource
-    private KnowledgeInfoMapper knowledgeInfoMapper;
-
-    public VectorStoreFactory(WeaviateVectorStore weaviateVectorStore, MilvusVectorStore milvusVectorStore) {
-        this.weaviateVectorStore = weaviateVectorStore;
-        this.milvusVectorStore = milvusVectorStore;
-    }
-
-    public VectorStore getVectorStore(String kid){
-        String vectorModel = "weaviate";
-        if (StrUtil.isNotEmpty(kid)) {
-            KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoMapper.selectVoById(Long.valueOf(kid));
-            if (knowledgeInfoVo != null && StrUtil.isNotEmpty(knowledgeInfoVo.getVector())) {
-                vectorModel = knowledgeInfoVo.getVector();
-            }
-        }
-        if ("weaviate".equals(vectorModel)){
-            return weaviateVectorStore;
-        }else if ("milvus".equals(vectorModel)){
-            return milvusVectorStore;
-        }
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStoreWrapper.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStoreWrapper.java
deleted file mode 100644
index e1daa61..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/VectorStoreWrapper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorstore;
-
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@Slf4j
-@Primary
-@AllArgsConstructor
-public class VectorStoreWrapper implements VectorStore {
-
-    private final VectorStoreFactory vectorStoreFactory;
-
-    @Override
-    public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        vectorStore.storeEmbeddings(chunkList, vectorList, kid, docId, fidList);
-    }
-
-    @Override
-    public void removeByDocId(String kid, String docId) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        vectorStore.removeByDocId(kid, docId);
-    }
-
-    @Override
-    public void removeByKid(String kid) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        vectorStore.removeByKid(kid);
-    }
-
-    @Override
-    public List<String> nearest(List<Double> queryVector, String kid) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        return vectorStore.nearest(queryVector, kid);
-    }
-
-    @Override
-    public List<String> nearest(String query, String kid) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        return vectorStore.nearest(query, kid);
-    }
-
-    @Override
-    public void newSchema(String kid) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        vectorStore.newSchema(kid);
-    }
-
-    @Override
-    public void removeByKidAndFid(String kid, String fid) {
-        VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
-        vectorStore.removeByKidAndFid(kid, fid);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java
deleted file mode 100644
index 785054d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java
+++ /dev/null
@@ -1,402 +0,0 @@
-package org.ruoyi.knowledge.chain.vectorstore;
-
-import cn.hutool.core.lang.UUID;
-import com.alibaba.fastjson2.JSONObject;
-import com.google.gson.internal.LinkedTreeMap;
-import io.weaviate.client.Config;
-import io.weaviate.client.WeaviateClient;
-import io.weaviate.client.base.Result;
-import io.weaviate.client.v1.data.model.WeaviateObject;
-import io.weaviate.client.v1.data.replication.model.ConsistencyLevel;
-import io.weaviate.client.v1.filters.Operator;
-import io.weaviate.client.v1.filters.WhereFilter;
-import io.weaviate.client.v1.graphql.model.GraphQLResponse;
-import io.weaviate.client.v1.graphql.query.argument.NearTextArgument;
-import io.weaviate.client.v1.graphql.query.argument.NearVectorArgument;
-import io.weaviate.client.v1.graphql.query.fields.Field;
-import io.weaviate.client.v1.misc.model.Meta;
-import io.weaviate.client.v1.misc.model.ReplicationConfig;
-import io.weaviate.client.v1.misc.model.ShardingConfig;
-import io.weaviate.client.v1.misc.model.VectorIndexConfig;
-import io.weaviate.client.v1.schema.model.DataType;
-import io.weaviate.client.v1.schema.model.Property;
-import io.weaviate.client.v1.schema.model.Schema;
-import io.weaviate.client.v1.schema.model.WeaviateClass;
-import jakarta.annotation.PostConstruct;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Slf4j
-public class WeaviateVectorStore implements VectorStore {
-
-    private volatile String protocol;
-    private volatile String host;
-    private volatile String className;
-
-    @Lazy
-    @Resource
-    private IKnowledgeInfoService knowledgeInfoService;
-
-    @Lazy
-    @Resource
-    private ConfigService configService;
-
-    @PostConstruct
-    public void loadConfig() {
-        this.protocol = configService.getConfigValue("weaviate", "protocol");
-        this.host = configService.getConfigValue("weaviate", "host");
-        this.className = configService.getConfigValue("weaviate", "classname");
-    }
-
-    public WeaviateClient getClient() {
-        Config config = new Config(protocol, host);
-        WeaviateClient client = new WeaviateClient(config);
-        return client;
-    }
-
-    public Result<Meta> getMeta() {
-        WeaviateClient client = getClient();
-        Result<Meta> meta = client.misc().metaGetter().run();
-        if (meta.getError() == null) {
-            System.out.printf("meta.hostname: %s\n", meta.getResult().getHostname());
-            System.out.printf("meta.version: %s\n", meta.getResult().getVersion());
-            System.out.printf("meta.modules: %s\n", meta.getResult().getModules());
-        } else {
-            System.out.printf("Error: %s\n", meta.getError().getMessages());
-        }
-        return meta;
-    }
-
-    public Result<Schema> getSchemas() {
-        WeaviateClient client = getClient();
-        Result<Schema> result = client.schema().getter().run();
-        if (result.hasErrors()) {
-            System.out.println(result.getError());
-        } else {
-            System.out.println(result.getResult());
-        }
-        return result;
-    }
-
-
-    public Result<Boolean> createSchema(String kid) {
-        WeaviateClient client = getClient();
-
-        VectorIndexConfig vectorIndexConfig = VectorIndexConfig.builder()
-                .distance("cosine")
-                .cleanupIntervalSeconds(300)
-                .efConstruction(128)
-                .maxConnections(64)
-                .vectorCacheMaxObjects(500000L)
-                .ef(-1)
-                .skip(false)
-                .dynamicEfFactor(8)
-                .dynamicEfMax(500)
-                .dynamicEfMin(100)
-                .flatSearchCutoff(40000)
-                .build();
-
-        ShardingConfig shardingConfig = ShardingConfig.builder()
-                .desiredCount(3)
-                .desiredVirtualCount(128)
-                .function("murmur3")
-                .key("_id")
-                .strategy("hash")
-                .virtualPerPhysical(128)
-                .build();
-
-        ReplicationConfig replicationConfig = ReplicationConfig.builder()
-                .factor(1)
-                .build();
-
-        JSONObject classModuleConfigValue = new JSONObject();
-        classModuleConfigValue.put("vectorizeClassName", false);
-        JSONObject classModuleConfig = new JSONObject();
-        classModuleConfig.put("text2vec-transformers", classModuleConfigValue);
-
-        JSONObject propertyModuleConfigValueSkipTrue = new JSONObject();
-        propertyModuleConfigValueSkipTrue.put("vectorizePropertyName", false);
-        propertyModuleConfigValueSkipTrue.put("skip", true);
-        JSONObject propertyModuleConfigSkipTrue = new JSONObject();
-        propertyModuleConfigSkipTrue.put("text2vec-transformers", propertyModuleConfigValueSkipTrue);
-
-        JSONObject propertyModuleConfigValueSkipFalse = new JSONObject();
-        propertyModuleConfigValueSkipFalse.put("vectorizePropertyName", false);
-        propertyModuleConfigValueSkipFalse.put("skip", false);
-        JSONObject propertyModuleConfigSkipFalse = new JSONObject();
-        propertyModuleConfigSkipFalse.put("text2vec-transformers", propertyModuleConfigValueSkipFalse);
-
-        WeaviateClass clazz = WeaviateClass.builder()
-                .className(className + kid)
-                .description("local knowledge")
-                .vectorIndexType("hnsw")
-                .vectorizer("text2vec-transformers")
-                .shardingConfig(shardingConfig)
-                .vectorIndexConfig(vectorIndexConfig)
-                .replicationConfig(replicationConfig)
-                .moduleConfig(classModuleConfig)
-                .properties(new ArrayList() {
-                    {
-                        add(Property.builder()
-                                .dataType(new ArrayList() {
-                                    {
-                                        add(DataType.TEXT);
-                                    }
-                                })
-                                .name("content")
-                                .description("The content of the local knowledge,for search")
-                                .moduleConfig(propertyModuleConfigSkipFalse)
-                                .build());
-                        add(Property.builder()
-                                .dataType(new ArrayList() {
-                                    {
-                                        add(DataType.TEXT);
-                                    }
-                                })
-                                .name("kid")
-                                .description("The knowledge id of the local knowledge,for search")
-                                .moduleConfig(propertyModuleConfigSkipTrue)
-                                .build());
-                        add(Property.builder()
-                                .dataType(new ArrayList() {
-                                    {
-                                        add(DataType.TEXT);
-                                    }
-                                })
-                                .name("docId")
-                                .description("The doc id of the local knowledge,for search")
-                                .moduleConfig(propertyModuleConfigSkipTrue)
-                                .build());
-                        add(Property.builder()
-                                .dataType(new ArrayList() {
-                                    {
-                                        add(DataType.TEXT);
-                                    }
-                                })
-                                .name("fid")
-                                .description("The fragment id of the local knowledge,for search")
-                                .moduleConfig(propertyModuleConfigSkipTrue)
-                                .build());
-                        add(Property.builder()
-                                .dataType(new ArrayList() {
-                                    {
-                                        add(DataType.TEXT);
-                                    }
-                                })
-                                .name("uuid")
-                                .description("The uuid id of the local knowledge fragment(same with id properties),for search")
-                                .moduleConfig(propertyModuleConfigSkipTrue)
-                                .build());
-                    } })
-                .build();
-
-        Result<Boolean> result = client.schema().classCreator().withClass(clazz).run();
-        if (result.hasErrors()) {
-            System.out.println(result.getError());
-        }
-        System.out.println(result.getResult());
-        return result;
-    }
-
-    @Override
-    public void newSchema(String kid) {
-        createSchema(kid);
-    }
-
-    @Override
-    public void removeByKidAndFid(String kid, String fid) {
-        List<String> resultList = new ArrayList<>();
-        WeaviateClient client = getClient();
-        Field fieldId = Field.builder().name("uuid").build();
-        WhereFilter where = WhereFilter.builder()
-                .path(new String[]{"fid"})
-                .operator(Operator.Equal)
-                .valueString(fid)
-                .build();
-        Result<GraphQLResponse> result = client.graphQL().get()
-                .withClassName(className + kid)
-                .withFields(fieldId)
-                .withWhere(where)
-                .run();
-        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
-        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
-        ArrayList<LinkedTreeMap> m = l.get(className + kid);
-        for (LinkedTreeMap linkedTreeMap : m) {
-            String uuid = linkedTreeMap.get("uuid").toString();
-            resultList.add(uuid);
-        }
-        for (String uuid : resultList) {
-            Result<Boolean> deleteResult = client.data().deleter()
-                    .withID(uuid)
-                    .withClassName(className + kid)
-                    .withConsistencyLevel(ConsistencyLevel.ALL)  // default QUORUM
-                    .run();
-        }
-    }
-
-    @Override
-    public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
-        WeaviateClient client = getClient();
-
-        for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) {
-            List<Double> vector = vectorList.get(i);
-            Float[] vf = vector.stream().map(Double::floatValue).toArray(Float[]::new);
-
-            Map<String, Object> dataSchema = new HashMap<>();
-            dataSchema.put("content", chunkList.get(i));
-            dataSchema.put("kid", kid);
-            dataSchema.put("docId", docId);
-            dataSchema.put("fid", fidList.get(i));
-            String uuid = UUID.randomUUID().toString();
-            dataSchema.put("uuid", uuid);
-
-            Result<WeaviateObject> result = client.data().creator()
-                    .withClassName(className + kid)
-                    .withID(uuid)
-                    .withVector(vf)
-                    .withProperties(dataSchema)
-                    .run();
-        }
-
-    }
-
-    @Override
-    public void removeByDocId(String kid, String docId) {
-        List<String> resultList = new ArrayList<>();
-        WeaviateClient client = getClient();
-        Field fieldId = Field.builder().name("uuid").build();
-        WhereFilter where = WhereFilter.builder()
-                .path(new String[]{"docId"})
-                .operator(Operator.Equal)
-                .valueString(docId)
-                .build();
-        Result<GraphQLResponse> result = client.graphQL().get()
-                .withClassName(className + kid)
-                .withFields(fieldId)
-                .withWhere(where)
-                .run();
-        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
-        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
-        ArrayList<LinkedTreeMap> m = l.get(className + kid);
-        for (LinkedTreeMap linkedTreeMap : m) {
-            String uuid = linkedTreeMap.get("uuid").toString();
-            resultList.add(uuid);
-        }
-        for (String uuid : resultList) {
-            Result<Boolean> deleteResult = client.data().deleter()
-                    .withID(uuid)
-                    .withClassName(className + kid)
-                    .withConsistencyLevel(ConsistencyLevel.ALL)  // default QUORUM
-                    .run();
-        }
-    }
-
-    @Override
-    public void removeByKid(String kid) {
-        WeaviateClient client = getClient();
-        Result<Boolean> result = client.schema().classDeleter().withClassName(className + kid).run();
-        if (result.hasErrors()) {
-            System.out.println("鍒犻櫎schema澶辫触" + result.getError());
-        } else {
-            System.out.println("鍒犻櫎schema鎴愬姛" + result.getResult());
-        }
-        log.info("drop schema by kid, result = {}", result);
-    }
-
-    @Override
-    public List<String> nearest(List<Double> queryVector, String kid) {
-        if (StringUtils.isBlank(kid)) {
-            return new ArrayList<String>();
-        }
-        List<String> resultList = new ArrayList<>();
-        Float[] vf = new Float[queryVector.size()];
-        for (int j = 0; j < queryVector.size(); j++) {
-            Double value = queryVector.get(j);
-            vf[j] = value.floatValue();
-        }
-        WeaviateClient client = getClient();
-        Field contentField = Field.builder().name("content").build();
-        Field _additional = Field.builder()
-                .name("_additional")
-                .fields(new Field[]{
-                        Field.builder().name("distance").build()
-                }).build();
-        NearVectorArgument nearVector = NearVectorArgument.builder()
-                .vector(vf)
-                .distance(1.6f) // certainty = 1f - distance /2f
-                .build();
-        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
-        Result<GraphQLResponse> result = client.graphQL().get()
-                .withClassName(className + kid)
-                .withFields(contentField, _additional)
-                .withNearVector(nearVector)
-                .withLimit(knowledgeInfoVo.getRetrieveLimit())
-                .run();
-        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
-        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
-        ArrayList<LinkedTreeMap> m = l.get(className + kid);
-        for (LinkedTreeMap linkedTreeMap : m) {
-            String content = linkedTreeMap.get("content").toString();
-            resultList.add(content);
-        }
-        return resultList;
-    }
-
-    @Override
-    public List<String> nearest(String query, String kid) {
-        if (StringUtils.isBlank(kid)) {
-            return new ArrayList<String>();
-        }
-        List<String> resultList = new ArrayList<>();
-        WeaviateClient client = getClient();
-        Field contentField = Field.builder().name("content").build();
-        Field _additional = Field.builder()
-                .name("_additional")
-                .fields(new Field[]{
-                        Field.builder().name("distance").build()
-                }).build();
-        NearTextArgument nearText = client.graphQL().arguments().nearTextArgBuilder()
-                .concepts(new String[]{query})
-                .distance(1.6f) // certainty = 1f - distance /2f
-                .build();
-        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
-        Result<GraphQLResponse> result = client.graphQL().get()
-                .withClassName(className + kid)
-                .withFields(contentField, _additional)
-                .withNearText(nearText)
-                .withLimit(knowledgeInfoVo.getRetrieveLimit())
-                .run();
-        LinkedTreeMap<String, Object> t = (LinkedTreeMap<String, Object>) result.getResult().getData();
-        LinkedTreeMap<String, ArrayList<LinkedTreeMap>> l = (LinkedTreeMap<String, ArrayList<LinkedTreeMap>>) t.get("Get");
-        ArrayList<LinkedTreeMap> m = l.get(className + kid);
-        for (LinkedTreeMap linkedTreeMap : m) {
-            String content = linkedTreeMap.get("content").toString();
-            resultList.add(content);
-        }
-        return resultList;
-    }
-
-    public Result<Boolean> deleteSchema(String kid) {
-        WeaviateClient client = getClient();
-        Result<Boolean> result = client.schema().classDeleter().withClassName(className + kid).run();
-        if (result.hasErrors()) {
-            System.out.println(result.getError());
-        } else {
-            System.out.println(result.getResult());
-        }
-        return result;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/constant/FileType.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/constant/FileType.java
deleted file mode 100644
index 6a9451a..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/constant/FileType.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.ruoyi.knowledge.constant;
-
-public class FileType {
-    public static final String TXT = "txt";
-    public static final String CSV = "csv";
-    public static final String MD = "md";
-    public static final String DOC = "doc";
-    public static final String DOCX = "docx";
-    public static final String PDF = "pdf";
-
-    public static final String LOG = "log";
-    public static final String XML = "xml";
-
-    public static final String JAVA = "java";
-    public static final String HTML = "html";
-    public static final String HTM = "htm";
-    public static final String CSS = "css";
-    public static final String JS = "js";
-    public static final String PY = "py";
-    public static final String CPP = "cpp";
-    public static final String SQL = "sql";
-    public static final String PHP = "php";
-    public static final String RUBY = "ruby";
-    public static final String C = "c";
-    public static final String H = "h";
-    public static final String HPP = "hpp";
-    public static final String SWIFT = "swift";
-    public static final String TS = "ts";
-    public static final String RUST = "rs";
-    public static final String PERL = "perl";
-    public static final String SHELL = "shell";
-    public static final String BAT = "bat";
-    public static final String CMD = "cmd";
-
-    public static final String PROPERTIES = "properties";
-    public static final String INI = "ini";
-    public static final String YAML = "yaml";
-    public static final String YML = "yml";
-
-    public static boolean isTextFile(String type){
-        if (type.equalsIgnoreCase(TXT) || type.equalsIgnoreCase(CSV) || type.equalsIgnoreCase(PROPERTIES)
-                || type.equalsIgnoreCase(INI) || type.equalsIgnoreCase(YAML) || type.equalsIgnoreCase(YML)
-                || type.equalsIgnoreCase(LOG) || type.equalsIgnoreCase(XML)){
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    public static boolean isCodeFile(String type){
-        if (type.equalsIgnoreCase(JAVA) || type.equalsIgnoreCase(HTML) || type.equalsIgnoreCase(HTM) || type.equalsIgnoreCase(JS) || type.equalsIgnoreCase(PY)
-                || type.equalsIgnoreCase(CPP) || type.equalsIgnoreCase(SQL) || type.equalsIgnoreCase(PHP) || type.equalsIgnoreCase(RUBY)
-                || type.equalsIgnoreCase(C) || type.equalsIgnoreCase(H) || type.equalsIgnoreCase(HPP) || type.equalsIgnoreCase(SWIFT)
-                || type.equalsIgnoreCase(TS) || type.equalsIgnoreCase(RUST) || type.equalsIgnoreCase(PERL) || type.equalsIgnoreCase(SHELL)
-                || type.equalsIgnoreCase(BAT) || type.equalsIgnoreCase(CMD) || type.equalsIgnoreCase(CSS)){
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    public static boolean isMdFile(String type){
-        if (type.equalsIgnoreCase(MD)){
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    public static boolean isWord(String type){
-        if (type.equalsIgnoreCase(DOC) || type.equalsIgnoreCase(DOCX)){
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    public static boolean isPdf(String type){
-        if (type.equalsIgnoreCase(PDF)){
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeAttach.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeAttach.java
deleted file mode 100644
index 694018d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeAttach.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.ruoyi.knowledge.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 鐭ヨ瘑搴撻檮浠跺璞� knowledge_attach
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-
-@TableName("knowledge_attach")
-public class KnowledgeAttach  extends BaseEntity {
-
-
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    private String kid;
-
-    /**
-     * 鏂囨。ID
-     */
-    private String docId;
-
-    /**
-     * 鏂囨。鍚嶇О
-     */
-    private String docName;
-
-    /**
-     * 鏂囨。绫诲瀷
-     */
-    private String docType;
-
-    /**
-     * 鏂囨。鍐呭
-     */
-    private String content;
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeFragment.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeFragment.java
deleted file mode 100644
index f733f06..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeFragment.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.ruoyi.knowledge.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 鐭ヨ瘑鐗囨瀵硅薄 knowledge_fragment
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@TableName("knowledge_fragment")
-public class KnowledgeFragment extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    private String kid;
-
-    /**
-     * 鏂囨。ID
-     */
-    private String docId;
-
-    /**
-     * 鐭ヨ瘑鐗囨ID
-     */
-    private String fid;
-
-    /**
-     * 鐗囨绱㈠紩涓嬫爣
-     */
-    private Integer idx;
-
-    /**
-     * 鏂囨。鍐呭
-     */
-    private String content;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeInfo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeInfo.java
deleted file mode 100644
index 4f1c482..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/KnowledgeInfo.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.ruoyi.knowledge.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-
-/**
- * 鐭ヨ瘑搴撳璞� knowledge_info
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@TableName("knowledge_info")
-public class KnowledgeInfo  extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    private String kid;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    private Long uid;
-
-    /**
-     * 鐭ヨ瘑搴撳悕绉�
-     */
-    private String kname;
-
-    /**
-     * 鏄惁鍏紑鐭ヨ瘑搴擄紙0 鍚� 1鏄級
-     */
-    private String share;
-
-    /**
-     * 鎻忚堪
-     */
-    private String description;
-
-    /**
-     * 鐭ヨ瘑鍒嗛殧绗�
-     */
-    private String knowledgeSeparator;
-
-    /**
-     * 鎻愰棶鍒嗛殧绗�
-     */
-    private String questionSeparator;
-
-    /**
-     * 閲嶅彔瀛楃鏁�
-     */
-    private Integer overlapChar;
-
-    /**
-     * 鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟
-     */
-    private Integer retrieveLimit;
-
-    /**
-     * 鏂囨湰鍧楀ぇ灏�
-     */
-    private Integer textBlockSize;
-
-    /**
-     * 鍚戦噺搴�
-     */
-    private String vector;
-
-    /**
-     * 鍚戦噺妯″瀷
-     */
-    private String vectorModel;
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeAttachBo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeAttachBo.java
deleted file mode 100644
index 497e717..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeAttachBo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.ruoyi.knowledge.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.knowledge.domain.KnowledgeAttach;
-
-/**
- * 鐭ヨ瘑搴撻檮浠朵笟鍔″璞� knowledge_attach
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = KnowledgeAttach.class, reverseConvertGenerate = false)
-public class KnowledgeAttachBo extends BaseEntity {
-
-    @NotNull(message = "涓嶈兘涓虹┖")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖")
-    private String kid;
-
-    /**
-     * 鏂囨。ID
-     */
-    @NotBlank(message = "鏂囨。ID涓嶈兘涓虹┖")
-    private String docId;
-
-    /**
-     * 鏂囨。鍚嶇О
-     */
-    @NotBlank(message = "鏂囨。鍚嶇О涓嶈兘涓虹┖")
-    private String docName;
-
-    /**
-     * 鏂囨。绫诲瀷
-     */
-    @NotBlank(message = "鏂囨。绫诲瀷涓嶈兘涓虹┖")
-    private String docType;
-
-    /**
-     * 鏂囨。鍐呭
-     */
-    @NotBlank(message = "鏂囨。鍐呭涓嶈兘涓虹┖")
-    private String content;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeFragmentBo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeFragmentBo.java
deleted file mode 100644
index be6bca1..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeFragmentBo.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.ruoyi.knowledge.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.knowledge.domain.KnowledgeFragment;
-
-/**
- * 鐭ヨ瘑鐗囨涓氬姟瀵硅薄 knowledge_fragment
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = KnowledgeFragment.class, reverseConvertGenerate = false)
-public class KnowledgeFragmentBo extends BaseEntity {
-
-    /**
-     *
-     */
-    @NotNull(message = "涓嶈兘涓虹┖")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖")
-    private String kid;
-
-    /**
-     * 鏂囨。ID
-     */
-    @NotBlank(message = "鏂囨。ID涓嶈兘涓虹┖")
-    private String docId;
-
-    /**
-     * 鐭ヨ瘑鐗囨ID
-     */
-    @NotBlank(message = "鐭ヨ瘑鐗囨ID涓嶈兘涓虹┖")
-    private String fid;
-
-    /**
-     * 鐗囨绱㈠紩涓嬫爣
-     */
-    @NotNull(message = "鐗囨绱㈠紩涓嬫爣涓嶈兘涓虹┖")
-    private Long idx;
-
-    /**
-     * 鏂囨。鍐呭
-     */
-    @NotBlank(message = "鏂囨。鍐呭涓嶈兘涓虹┖")
-    private String content;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeInfoBo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeInfoBo.java
deleted file mode 100644
index b606d82..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/bo/KnowledgeInfoBo.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.ruoyi.knowledge.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.knowledge.domain.KnowledgeInfo;
-
-/**
- * 鐭ヨ瘑搴撲笟鍔″璞� knowledge_info
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = KnowledgeInfo.class, reverseConvertGenerate = false)
-public class KnowledgeInfoBo extends BaseEntity {
-
-    /**
-     *
-     */
-    @NotNull(message = "涓嶈兘涓虹┖")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖")
-    private String kid;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    @NotNull(message = "鐢ㄦ埛ID涓嶈兘涓虹┖")
-    private Long uid;
-
-    /**
-     * 鐭ヨ瘑搴撳悕绉�
-     */
-    @NotBlank(message = "鐭ヨ瘑搴撳悕绉颁笉鑳戒负绌�")
-    private String kname;
-
-    /**
-     * 鐭ヨ瘑搴撳悕绉�
-     */
-    @NotBlank(message = "鏄惁鍏紑鐭ヨ瘑搴�")
-    private String share;
-
-    /**
-     * 鎻忚堪
-     */
-    @NotBlank(message = "鎻忚堪涓嶈兘涓虹┖")
-    private String description;
-
-    /**
-     * 鐭ヨ瘑鍒嗛殧绗�
-     */
-    @NotBlank(message = "鐭ヨ瘑鍒嗛殧绗︿笉鑳戒负绌�")
-    private String knowledgeSeparator;
-
-    /**
-     * 鎻愰棶鍒嗛殧绗�
-     */
-    @NotBlank(message = "鎻愰棶鍒嗛殧绗︿笉鑳戒负绌�")
-    private String questionSeparator;
-
-    /**
-     * 閲嶅彔瀛楃鏁�
-     */
-    @NotNull(message = "閲嶅彔瀛楃鏁颁笉鑳戒负绌�")
-    private Integer overlapChar;
-
-    /**
-     * 鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟
-     */
-    @NotNull(message = "鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟涓嶈兘涓虹┖")
-    private Integer retrieveLimit;
-
-    /**
-     * 鏂囨湰鍧楀ぇ灏�
-     */
-    @NotNull(message = "鏂囨湰鍧楀ぇ灏忎笉鑳戒负绌�")
-    private Integer textBlockSize;
-
-    /**
-     * 鍚戦噺搴�
-     */
-    @NotBlank(message = "鍚戦噺搴撲笉鑳戒负绌�")
-    private String vector;
-
-    /**
-     * 鍚戦噺妯″瀷
-     */
-    @NotBlank(message = "鍚戦噺妯″瀷涓嶈兘涓虹┖")
-    private String vectorModel;
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/req/KnowledgeInfoUploadRequest.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/req/KnowledgeInfoUploadRequest.java
deleted file mode 100644
index 866119d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/req/KnowledgeInfoUploadRequest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.ruoyi.knowledge.domain.req;
-
-import lombok.Data;
-import org.springframework.web.multipart.MultipartFile;
-
-@Data
-public class KnowledgeInfoUploadRequest {
-
-    private String kid;
-
-    private MultipartFile file;
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/request.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/request.java
deleted file mode 100644
index 9a84995..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/request.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.ruoyi.knowledge.domain;
-
-public class request {
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeAttachVo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeAttachVo.java
deleted file mode 100644
index bd0b141..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeAttachVo.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.knowledge.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.knowledge.domain.KnowledgeAttach;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 鐭ヨ瘑搴撻檮浠惰鍥惧璞� knowledge_attach
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = KnowledgeAttach.class)
-public class KnowledgeAttachVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @ExcelProperty(value = "")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
-    private String kid;
-
-    /**
-     * 鏂囨。ID
-     */
-    @ExcelProperty(value = "鏂囨。ID")
-    private String docId;
-
-    /**
-     * 鏂囨。鍚嶇О
-     */
-    @ExcelProperty(value = "鏂囨。鍚嶇О")
-    private String docName;
-
-    /**
-     * 鏂囨。绫诲瀷
-     */
-    @ExcelProperty(value = "鏂囨。绫诲瀷")
-    private String docType;
-
-    /**
-     * 鏂囨。鍐呭
-     */
-    @ExcelProperty(value = "鏂囨。鍐呭")
-    private String content;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeFragmentVo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeFragmentVo.java
deleted file mode 100644
index 630bbe0..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeFragmentVo.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.ruoyi.knowledge.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.knowledge.domain.KnowledgeFragment;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 鐭ヨ瘑鐗囨瑙嗗浘瀵硅薄 knowledge_fragment
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = KnowledgeFragment.class)
-public class KnowledgeFragmentVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @ExcelProperty(value = "")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
-    private String kid;
-
-    /**
-     * 鏂囨。ID
-     */
-    @ExcelProperty(value = "鏂囨。ID")
-    private String docId;
-
-    /**
-     * 鐭ヨ瘑鐗囨ID
-     */
-    @ExcelProperty(value = "鐭ヨ瘑鐗囨ID")
-    private String fid;
-
-    /**
-     * 鐗囨绱㈠紩涓嬫爣
-     */
-    @ExcelProperty(value = "鐗囨绱㈠紩涓嬫爣")
-    private Long idx;
-
-    /**
-     * 鏂囨。鍐呭
-     */
-    @ExcelProperty(value = "鏂囨。鍐呭")
-    private String content;
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeInfoVo.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeInfoVo.java
deleted file mode 100644
index a47b5d6..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/domain/vo/KnowledgeInfoVo.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.ruoyi.knowledge.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.knowledge.domain.KnowledgeInfo;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 鐭ヨ瘑搴撹鍥惧璞� knowledge_info
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = KnowledgeInfo.class)
-public class KnowledgeInfoVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @ExcelProperty(value = "")
-    private Long id;
-
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
-    private String kid;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    @ExcelProperty(value = "鐢ㄦ埛ID")
-    private Long uid;
-
-    /**
-     * 鐭ヨ瘑搴撳悕绉�
-     */
-    @ExcelProperty(value = "鐭ヨ瘑搴撳悕绉�")
-    private String kname;
-
-    /**
-     * 鐭ヨ瘑搴撳悕绉�
-     */
-    private String share;
-
-    /**
-     * 鎻忚堪
-     */
-    @ExcelProperty(value = "鎻忚堪")
-    private String description;
-
-    /**
-     * 鐭ヨ瘑鍒嗛殧绗�
-     */
-    @ExcelProperty(value = "鐭ヨ瘑鍒嗛殧绗�")
-    private String knowledgeSeparator;
-
-    /**
-     * 鎻愰棶鍒嗛殧绗�
-     */
-    @ExcelProperty(value = "鎻愰棶鍒嗛殧绗�")
-    private String questionSeparator;
-
-    /**
-     * 閲嶅彔瀛楃鏁�
-     */
-    @ExcelProperty(value = "閲嶅彔瀛楃鏁�")
-    private Integer overlapChar;
-
-    /**
-     * 鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟
-     */
-    @ExcelProperty(value = "鐭ヨ瘑搴撲腑妫�绱㈢殑鏉℃暟")
-    private Integer retrieveLimit;
-
-    /**
-     * 鏂囨湰鍧楀ぇ灏�
-     */
-    @ExcelProperty(value = "鏂囨湰鍧楀ぇ灏�")
-    private Integer textBlockSize;
-
-    /**
-     * 鍚戦噺搴�
-     */
-    @ExcelProperty(value = "鍚戦噺搴�")
-    private String vector;
-
-    /**
-     * 鍚戦噺妯″瀷
-     */
-    @ExcelProperty(value = "鍚戦噺妯″瀷")
-    private String vectorModel;
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeAttachMapper.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeAttachMapper.java
deleted file mode 100644
index ec7d264..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeAttachMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.knowledge.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.knowledge.domain.KnowledgeAttach;
-import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
-
-/**
- * 鐭ヨ瘑搴撻檮浠禡apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-public interface KnowledgeAttachMapper extends BaseMapperPlus<KnowledgeAttach, KnowledgeAttachVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeFragmentMapper.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeFragmentMapper.java
deleted file mode 100644
index 92d9ccb..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeFragmentMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.knowledge.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.knowledge.domain.KnowledgeFragment;
-import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
-
-/**
- * 鐭ヨ瘑鐗囨Mapper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-public interface KnowledgeFragmentMapper extends BaseMapperPlus<KnowledgeFragment, KnowledgeFragmentVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeInfoMapper.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeInfoMapper.java
deleted file mode 100644
index 1984e0a..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/mapper/KnowledgeInfoMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.knowledge.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.knowledge.domain.KnowledgeInfo;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-
-/**
- * 鐭ヨ瘑搴揗apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-public interface KnowledgeInfoMapper extends BaseMapperPlus<KnowledgeInfo, KnowledgeInfoVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/EmbeddingService.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/EmbeddingService.java
deleted file mode 100644
index a4dd30d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/EmbeddingService.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.ruoyi.knowledge.service;
-
-import java.util.List;
-
-public interface EmbeddingService {
-
-    void storeEmbeddings(List<String> chunkList, String kid, String docId,List<String> fidList);
-
-    void removeByDocId(String kid,String docId);
-
-    void removeByKid(String kid);
-
-    List<Double> getQueryVector(String query, String kid);
-
-    void createSchema(String kid);
-
-    void removeByKidAndFid(String kid, String fid);
-
-    void saveFragment(String kid, String docId, String fid, String content);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeAttachService.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeAttachService.java
deleted file mode 100644
index 6ed856e..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeAttachService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.ruoyi.knowledge.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
-import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 鐭ヨ瘑搴撻檮浠禨ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-public interface IKnowledgeAttachService {
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撻檮浠�
-     */
-    KnowledgeAttachVo queryById(Long id);
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
-     */
-    TableDataInfo<KnowledgeAttachVo> queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
-     */
-    List<KnowledgeAttachVo> queryList(KnowledgeAttachBo bo);
-
-    /**
-     * 鏂板鐭ヨ瘑搴撻檮浠�
-     */
-    Boolean insertByBo(KnowledgeAttachBo bo);
-
-    /**
-     * 淇敼鐭ヨ瘑搴撻檮浠�
-     */
-    Boolean updateByBo(KnowledgeAttachBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ょ煡璇嗗簱闄勪欢淇℃伅
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-
-
-    /**
-     * 鍒犻櫎鐭ヨ瘑闄勪欢
-     */
-    void removeKnowledgeAttach(String docId);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeFragmentService.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeFragmentService.java
deleted file mode 100644
index 7546a1d..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeFragmentService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.knowledge.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
-import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 鐭ヨ瘑鐗囨Service鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-public interface IKnowledgeFragmentService {
-
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨
-     */
-    KnowledgeFragmentVo queryById(Long id);
-
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
-     */
-    TableDataInfo<KnowledgeFragmentVo> queryPageList(KnowledgeFragmentBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
-     */
-    List<KnowledgeFragmentVo> queryList(KnowledgeFragmentBo bo);
-
-    /**
-     * 鏂板鐭ヨ瘑鐗囨
-     */
-    Boolean insertByBo(KnowledgeFragmentBo bo);
-
-    /**
-     * 淇敼鐭ヨ瘑鐗囨
-     */
-    Boolean updateByBo(KnowledgeFragmentBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ょ煡璇嗙墖娈典俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeInfoService.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeInfoService.java
deleted file mode 100644
index 14e8e97..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/IKnowledgeInfoService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.ruoyi.knowledge.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
-import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-
-import java.util.List;
-
-/**
- * 鐭ヨ瘑搴揝ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-public interface IKnowledgeInfoService {
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴�
-     */
-    KnowledgeInfoVo queryById(Long id);
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
-     */
-    TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
-     */
-    List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo);
-
-
-    /**
-     * 淇敼鐭ヨ瘑搴�
-     */
-    Boolean updateByBo(KnowledgeInfoBo bo);
-
-    /**
-     * 鏂板鐭ヨ瘑搴�
-     */
-    void saveOne(KnowledgeInfoBo bo);
-
-    /**
-     * 涓婁紶闄勪欢
-     */
-    void upload(KnowledgeInfoUploadRequest request);
-
-    /**
-     * 鍒犻櫎鐭ヨ瘑搴�
-     */
-    void removeKnowledge(String id);
-
-    /**
-     * 妫�鏌ユ槸鍚︽湁鍒犻櫎鏉冮檺
-     * @param knowledgeInfoList 鐭ヨ瘑鍒楄〃
-     */
-    void check(List<KnowledgeInfoVo> knowledgeInfoList);
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/EmbeddingServiceImpl.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/EmbeddingServiceImpl.java
deleted file mode 100644
index 96e568a..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/EmbeddingServiceImpl.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.ruoyi.knowledge.service.impl;
-
-import lombok.AllArgsConstructor;
-import org.ruoyi.knowledge.chain.vectorizer.Vectorization;
-import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
-import org.ruoyi.knowledge.service.EmbeddingService;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-@AllArgsConstructor
-public class EmbeddingServiceImpl implements EmbeddingService {
-
-    private final VectorStore vectorStore;
-    private final Vectorization vectorization;
-
-    /**
-     * 淇濆瓨鍚戦噺鏁版嵁搴�
-     * @param chunkList         鏂囨。鎸夎鍒囧垎鐨勭墖娈�
-     * @param kid               鐭ヨ瘑搴揑D
-     * @param docId             鏂囨。ID
-     */
-    @Override
-    public void storeEmbeddings(List<String> chunkList, String kid, String docId,List<String> fidList) {
-        List<List<Double>> vectorList = vectorization.batchVectorization(chunkList, kid);
-        vectorStore.storeEmbeddings(chunkList,vectorList,kid,docId,fidList);
-    }
-
-    @Override
-    public void removeByDocId(String kid,String docId) {
-        vectorStore.removeByDocId(kid,docId);
-    }
-
-    @Override
-    public void removeByKid(String kid) {
-        vectorStore.removeByKid(kid);
-    }
-
-    @Override
-    public List<Double> getQueryVector(String query, String kid) {
-        return vectorization.singleVectorization(query,kid);
-    }
-
-    @Override
-    public void createSchema(String kid) {
-        vectorStore.newSchema(kid);
-    }
-
-    @Override
-    public void removeByKidAndFid(String kid, String fid) {
-        vectorStore.removeByKidAndFid(kid,fid);
-    }
-
-    @Override
-    public void saveFragment(String kid, String docId, String fid, String content) {
-        List<String> chunkList = new ArrayList<>();
-        List<String> fidList = new ArrayList<>();
-        chunkList.add(content);
-        fidList.add(fid);
-        storeEmbeddings(chunkList,kid,docId,fidList);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeAttachServiceImpl.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeAttachServiceImpl.java
deleted file mode 100644
index 8ae5340..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeAttachServiceImpl.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.ruoyi.knowledge.service.impl;
-
-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.ruoyi.common.core.domain.model.LoginUser;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.knowledge.domain.KnowledgeAttach;
-import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
-import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.mapper.KnowledgeAttachMapper;
-import org.ruoyi.knowledge.mapper.KnowledgeFragmentMapper;
-import org.ruoyi.knowledge.mapper.KnowledgeInfoMapper;
-import org.ruoyi.knowledge.service.IKnowledgeAttachService;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 鐭ヨ瘑搴撻檮浠禨ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@RequiredArgsConstructor
-@Service
-public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService {
-
-    private final KnowledgeAttachMapper baseMapper;
-
-    private final KnowledgeFragmentMapper fragmentMapper;
-
-    private final KnowledgeInfoMapper knowledgeInfoMapper;
-
-    private final IKnowledgeInfoService knowledgeInfoService;
-
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撻檮浠�
-     */
-    @Override
-    public KnowledgeAttachVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
-     */
-    @Override
-    public TableDataInfo<KnowledgeAttachVo> queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
-        Page<KnowledgeAttachVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撻檮浠跺垪琛�
-     */
-    @Override
-    public List<KnowledgeAttachVo> queryList(KnowledgeAttachBo bo) {
-        LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<KnowledgeAttach> buildQueryWrapper(KnowledgeAttachBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<KnowledgeAttach> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeAttach::getKid, bo.getKid());
-        lqw.eq(StringUtils.isNotBlank(bo.getDocId()), KnowledgeAttach::getDocId, bo.getDocId());
-        lqw.like(StringUtils.isNotBlank(bo.getDocName()), KnowledgeAttach::getDocName, bo.getDocName());
-        lqw.eq(StringUtils.isNotBlank(bo.getDocType()), KnowledgeAttach::getDocType, bo.getDocType());
-        lqw.eq(StringUtils.isNotBlank(bo.getContent()), KnowledgeAttach::getContent, bo.getContent());
-        return lqw;
-    }
-
-    /**
-     * 鏂板鐭ヨ瘑搴撻檮浠�
-     */
-    @Override
-    public Boolean insertByBo(KnowledgeAttachBo bo) {
-        KnowledgeAttach add = MapstructUtils.convert(bo, KnowledgeAttach.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼鐭ヨ瘑搴撻檮浠�
-     */
-    @Override
-    public Boolean updateByBo(KnowledgeAttachBo bo) {
-        KnowledgeAttach update = MapstructUtils.convert(bo, KnowledgeAttach.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(KnowledgeAttach entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎鐭ヨ瘑搴撻檮浠�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-
-    @Override
-    public void removeKnowledgeAttach(String docId) {
-        Map<String,Object> map = new HashMap<>();
-        map.put("doc_id",docId);
-        baseMapper.deleteByMap(map);
-        fragmentMapper.deleteByMap(map);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeFragmentServiceImpl.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeFragmentServiceImpl.java
deleted file mode 100644
index ff6efcc..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeFragmentServiceImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.ruoyi.knowledge.service.impl;
-
-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.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.knowledge.domain.KnowledgeFragment;
-import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
-import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
-import org.ruoyi.knowledge.mapper.KnowledgeFragmentMapper;
-import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-/**
- * 鐭ヨ瘑鐗囨Service涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@RequiredArgsConstructor
-@Service
-public class KnowledgeFragmentServiceImpl implements IKnowledgeFragmentService {
-
-    private final KnowledgeFragmentMapper baseMapper;
-
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨
-     */
-    @Override
-    public KnowledgeFragmentVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
-     */
-    @Override
-    public TableDataInfo<KnowledgeFragmentVo> queryPageList(KnowledgeFragmentBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<KnowledgeFragment> lqw = buildQueryWrapper(bo);
-        lqw.eq(KnowledgeFragment::getDocId, bo.getDocId());
-        Page<KnowledgeFragmentVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨鍒楄〃
-     */
-    @Override
-    public List<KnowledgeFragmentVo> queryList(KnowledgeFragmentBo bo) {
-        LambdaQueryWrapper<KnowledgeFragment> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<KnowledgeFragment> buildQueryWrapper(KnowledgeFragmentBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<KnowledgeFragment> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeFragment::getKid, bo.getKid());
-        lqw.eq(StringUtils.isNotBlank(bo.getDocId()), KnowledgeFragment::getDocId, bo.getDocId());
-        lqw.eq(StringUtils.isNotBlank(bo.getFid()), KnowledgeFragment::getFid, bo.getFid());
-        lqw.eq(bo.getIdx() != null, KnowledgeFragment::getIdx, bo.getIdx());
-        lqw.eq(StringUtils.isNotBlank(bo.getContent()), KnowledgeFragment::getContent, bo.getContent());
-        return lqw;
-    }
-
-    /**
-     * 鏂板鐭ヨ瘑鐗囨
-     */
-    @Override
-    public Boolean insertByBo(KnowledgeFragmentBo bo) {
-        KnowledgeFragment add = MapstructUtils.convert(bo, KnowledgeFragment.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼鐭ヨ瘑鐗囨
-     */
-    @Override
-    public Boolean updateByBo(KnowledgeFragmentBo bo) {
-        KnowledgeFragment update = MapstructUtils.convert(bo, KnowledgeFragment.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(KnowledgeFragment entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎鐭ヨ瘑鐗囨
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeInfoServiceImpl.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeInfoServiceImpl.java
deleted file mode 100644
index 23f255b..0000000
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/service/impl/KnowledgeInfoServiceImpl.java
+++ /dev/null
@@ -1,200 +0,0 @@
-package org.ruoyi.knowledge.service.impl;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.RandomUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.model.LoginUser;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.knowledge.chain.loader.ResourceLoader;
-import org.ruoyi.knowledge.chain.loader.ResourceLoaderFactory;
-import org.ruoyi.knowledge.domain.KnowledgeAttach;
-import org.ruoyi.knowledge.domain.KnowledgeFragment;
-import org.ruoyi.knowledge.domain.KnowledgeInfo;
-import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
-import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
-import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-import org.ruoyi.knowledge.mapper.KnowledgeAttachMapper;
-import org.ruoyi.knowledge.mapper.KnowledgeFragmentMapper;
-import org.ruoyi.knowledge.mapper.KnowledgeInfoMapper;
-import org.ruoyi.knowledge.service.EmbeddingService;
-import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.*;
-
-/**
- * 鐭ヨ瘑搴揝ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-10-21
- */
-@Service
-@RequiredArgsConstructor
-public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
-
-    private final KnowledgeInfoMapper baseMapper;
-
-    private final EmbeddingService embeddingService;
-
-    private final ResourceLoaderFactory resourceLoaderFactory;
-
-    private final KnowledgeFragmentMapper fragmentMapper;
-
-    private final KnowledgeAttachMapper attachMapper;
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴�
-     */
-    @Override
-    public KnowledgeInfoVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
-     */
-    @Override
-    public TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
-        Page<KnowledgeInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
-     */
-    @Override
-    public List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo) {
-        LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<KnowledgeInfo> buildQueryWrapper(KnowledgeInfoBo bo) {
-        LambdaQueryWrapper<KnowledgeInfo> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeInfo::getKid, bo.getKid());
-        lqw.eq(bo.getUid() != null, KnowledgeInfo::getUid, bo.getUid());
-        lqw.like(StringUtils.isNotBlank(bo.getKname()), KnowledgeInfo::getKname, bo.getKname());
-        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), KnowledgeInfo::getDescription, bo.getDescription());
-        // 鏌ヨ鍏紑鐨勭煡璇嗗簱
-        lqw.or(wrapper -> wrapper.eq(KnowledgeInfo::getShare, "1"));
-        return lqw;
-    }
-
-    /**
-     * 淇敼鐭ヨ瘑搴�
-     */
-    @Override
-    public Boolean updateByBo(KnowledgeInfoBo bo) {
-        KnowledgeInfo update = MapstructUtils.convert(bo, KnowledgeInfo.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(KnowledgeInfo entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void saveOne(KnowledgeInfoBo bo) {
-        KnowledgeInfo knowledgeInfo = MapstructUtils.convert(bo, KnowledgeInfo.class);
-        if (StringUtils.isBlank(bo.getKid())){
-            String kid = RandomUtil.randomString(10);
-            if (knowledgeInfo != null) {
-                knowledgeInfo.setKid(kid);
-                knowledgeInfo.setUid(LoginHelper.getLoginUser().getUserId());
-            }
-            baseMapper.insert(knowledgeInfo);
-            embeddingService.createSchema(String.valueOf(knowledgeInfo.getId()));
-        }else {
-            baseMapper.updateById(knowledgeInfo);
-        }
-    }
-
-    @Override
-    public void upload(KnowledgeInfoUploadRequest request) {
-        storeContent(request.getFile(), request.getKid());
-    }
-
-    public void storeContent(MultipartFile file, String kid) {
-        String fileName = file.getOriginalFilename();
-        List<String> chunkList = new ArrayList<>();
-        KnowledgeAttach knowledgeAttach = new KnowledgeAttach();
-        knowledgeAttach.setKid(kid);
-        String docId = RandomUtil.randomString(10);
-        knowledgeAttach.setDocId(docId);
-        knowledgeAttach.setDocName(fileName);
-        knowledgeAttach.setDocType(fileName.substring(fileName.lastIndexOf(".")+1));
-        String content = "";
-        ResourceLoader resourceLoader = resourceLoaderFactory.getLoaderByFileType(knowledgeAttach.getDocType());
-        List<String> fids = new ArrayList<>();
-        try {
-            content = resourceLoader.getContent(file.getInputStream());
-            chunkList = resourceLoader.getChunkList(content, kid);
-            List<KnowledgeFragment> knowledgeFragmentList = new ArrayList<>();
-            if (CollUtil.isNotEmpty(chunkList)) {
-                for (int i = 0; i < chunkList.size(); i++) {
-                    String fid = RandomUtil.randomString(16);
-                    fids.add(fid);
-                    KnowledgeFragment knowledgeFragment = new KnowledgeFragment();
-                    knowledgeFragment.setKid(kid);
-                    knowledgeFragment.setDocId(docId);
-                    knowledgeFragment.setFid(fid);
-                    knowledgeFragment.setIdx(i);
-                    // String text = convertTextBlockToPretrainData(chunkList.get(i));
-                    knowledgeFragment.setContent(chunkList.get(i));
-                    knowledgeFragment.setCreateTime(new Date());
-                    knowledgeFragmentList.add(knowledgeFragment);
-                }
-            }
-            fragmentMapper.insertBatch(knowledgeFragmentList);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        knowledgeAttach.setContent(content);
-        knowledgeAttach.setCreateTime(new Date());
-        attachMapper.insert(knowledgeAttach);
-        embeddingService.storeEmbeddings(chunkList,kid,docId,fids);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void removeKnowledge(String id) {
-        Map<String,Object> map = new HashMap<>();
-        map.put("kid",id);
-        List<KnowledgeInfoVo> knowledgeInfoList = baseMapper.selectVoByMap(map);
-        check(knowledgeInfoList);
-        // 鍒犻櫎鍚戦噺搴撲俊鎭�
-        knowledgeInfoList.forEach(knowledgeInfoVo -> {
-            embeddingService.removeByKid(String.valueOf(knowledgeInfoVo.getId()));
-        });
-        // 鍒犻櫎闄勪欢鍜岀煡璇嗙墖娈�
-        fragmentMapper.deleteByMap(map);
-        attachMapper.deleteByMap(map);
-        // 鍒犻櫎鐭ヨ瘑搴�
-        baseMapper.deleteByMap(map);
-    }
-
-    @Override
-    public void check(List<KnowledgeInfoVo> knowledgeInfoList){
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        for (KnowledgeInfoVo knowledgeInfoVo : knowledgeInfoList) {
-            if(!knowledgeInfoVo.getUid().equals(loginUser.getUserId())){
-                throw new SecurityException("鏉冮檺涓嶈冻");
-            }
-        }
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml
index 17d37c5..a22691d 100644
--- a/ruoyi-modules/ruoyi-system/pom.xml
+++ b/ruoyi-modules/ruoyi-system/pom.xml
@@ -118,17 +118,19 @@
             <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-common-pay</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.github.ollama4j</groupId>
-            <artifactId>ollama4j</artifactId>
-            <version>1.0.79</version>
-            <scope>compile</scope>
-        </dependency>
+
+
         <dependency>
             <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-common-mail</artifactId>
         </dependency>
 
+
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-system-api</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/AbstractBuilder.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/AbstractBuilder.java
deleted file mode 100644
index 1876337..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/AbstractBuilder.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.ruoyi.system.builder;
-
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- *  @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-public abstract class AbstractBuilder {
-  protected final Logger logger = LoggerFactory.getLogger(getClass());
-
-  public abstract WxCpXmlOutMessage build(String content, WxCpXmlMessage wxMessage, WxCpService service);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/ImageBuilder.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/ImageBuilder.java
deleted file mode 100644
index 048372e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/ImageBuilder.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.ruoyi.system.builder;
-
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutImageMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-
-
-/**
- *  @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-public class ImageBuilder extends AbstractBuilder {
-
-  @Override
-  public WxCpXmlOutMessage build(String content, WxCpXmlMessage wxMessage,
-                                 WxCpService service) {
-
-    WxCpXmlOutImageMessage m = WxCpXmlOutMessage.IMAGE().mediaId(content)
-        .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
-        .build();
-
-    return m;
-  }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/TextBuilder.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/TextBuilder.java
deleted file mode 100644
index c60fe8f..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/builder/TextBuilder.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.ruoyi.system.builder;
-
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTextMessage;
-
-/**
- *  @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-public class TextBuilder extends AbstractBuilder {
-
-  @Override
-  public WxCpXmlOutMessage build(String content, WxCpXmlMessage wxMessage,
-                                 WxCpService service) {
-    WxCpXmlOutTextMessage m = WxCpXmlOutMessage.TEXT().content(content)
-        .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
-        .build();
-    return m;
-  }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/GptConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/GptConfig.java
deleted file mode 100644
index 1200f51..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/GptConfig.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.ruoyi.system.cofing;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * gpt閰嶇疆
- *
- * @author ashinnotfound
- * @date 2023/03/04
- */
-@Data
-@Component
-@ConfigurationProperties("gpt")
-public class GptConfig {
-    private String baseUrl;
-    private String model;
-    private Integer maxToken;
-    private Double temperature;
-    private List<String> basicPrompt;
-    private List<String> apiKey;
-    private Long ofSeconds;
-    private String imageQuality;
-    private String imageStyle;
-    private String audioModel;
-    private String audioVoice;
-    private Double audioSpeed;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/OkHttpConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/OkHttpConfig.java
deleted file mode 100644
index b7406c1..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/OkHttpConfig.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.ruoyi.system.cofing;
-
-import jakarta.annotation.PostConstruct;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.utils.OkHttpUtil;
-import org.ruoyi.system.domain.bo.SysModelBo;
-import org.ruoyi.system.domain.vo.SysModelVo;
-import org.ruoyi.system.service.ISysModelService;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Component
-@RequiredArgsConstructor
-public class OkHttpConfig {
-
-    private final ISysModelService sysModelService;
-    private final Map<String, OkHttpUtil> okHttpUtilMap = new HashMap<>();
-    @Getter
-    private String generate;
-
-    @PostConstruct
-    public void init() {
-        initializeOkHttpUtil("suno");
-        initializeOkHttpUtil("luma");
-        initializeOkHttpUtil("ppt");
-    }
-
-    private void initializeOkHttpUtil(String modelName) {
-        SysModelBo sysModelBo = new SysModelBo();
-        sysModelBo.setModelName(modelName);
-        List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
-        if (!sysModelList.isEmpty()) {
-            SysModelVo model = sysModelList.get(0);
-            OkHttpUtil okHttpUtil = new OkHttpUtil();
-            okHttpUtil.setApiHost(model.getApiHost());
-            okHttpUtil.setApiKey(model.getApiKey());
-            generate = String.valueOf(model.getModelPrice());
-            okHttpUtilMap.put(modelName, okHttpUtil);
-        }
-    }
-
-    public OkHttpUtil getOkHttpUtil(String modelName) {
-        return okHttpUtilMap.get(modelName);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/QqConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/QqConfig.java
deleted file mode 100644
index 34ccccd..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/QqConfig.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.ruoyi.system.cofing;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-/**
- * qq閰嶇疆
- *
- * @author ashinnotfound
- * @date 2023/03/04
- */
-@Data
-@Component
-@ConfigurationProperties("qq")
-public class QqConfig {
-    private Boolean enable;
-    private Long account;
-    private Boolean acceptNewFriend;
-    private Boolean acceptNewGroup;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxCpConfiguration.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxCpConfiguration.java
deleted file mode 100644
index 784c939..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxCpConfiguration.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.ruoyi.system.cofing;
-
-
-import com.google.common.collect.Maps;
-import jakarta.annotation.PostConstruct;
-import lombok.val;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
-import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
-import me.chanjar.weixin.cp.constant.WxCpConsts;
-import me.chanjar.weixin.cp.message.WxCpMessageRouter;
-import org.ruoyi.system.handler.wxcp.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-import me.chanjar.weixin.cp.api.WxCpService;
-
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * 鍗曞疄渚嬮厤缃�
- *
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Configuration
-@EnableConfigurationProperties(WxCpProperties.class)
-public class WxCpConfiguration {
-    private LogHandler logHandler;
-    private NullHandler nullHandler;
-    private LocationHandler locationHandler;
-    private MenuHandler menuHandler;
-    private MsgHandler msgHandler;
-    private UnsubscribeHandler unsubscribeHandler;
-    private SubscribeHandler subscribeHandler;
-
-    private WxCpProperties properties;
-
-    private static Map<Integer, WxCpMessageRouter> routers = Maps.newHashMap();
-    private static Map<Integer, WxCpService> cpServices = Maps.newHashMap();
-
-    @Autowired
-    public WxCpConfiguration(LogHandler logHandler, NullHandler nullHandler, LocationHandler locationHandler,
-                             MenuHandler menuHandler, MsgHandler msgHandler, UnsubscribeHandler unsubscribeHandler,
-                             SubscribeHandler subscribeHandler, WxCpProperties properties) {
-        this.logHandler = logHandler;
-        this.nullHandler = nullHandler;
-        this.locationHandler = locationHandler;
-        this.menuHandler = menuHandler;
-        this.msgHandler = msgHandler;
-        this.unsubscribeHandler = unsubscribeHandler;
-        this.subscribeHandler = subscribeHandler;
-        this.properties = properties;
-    }
-
-
-    public static Map<Integer, WxCpMessageRouter> getRouters() {
-        return routers;
-    }
-
-    public static WxCpService getCpService(Integer agentId) {
-        return cpServices.get(agentId);
-    }
-
-    @PostConstruct
-    public void initServices() {
-        cpServices = this.properties.getAppConfigs().stream().map(a -> {
-            val configStorage = new WxCpDefaultConfigImpl();
-            configStorage.setCorpId(this.properties.getCorpId());
-            configStorage.setAgentId(a.getAgentId());
-            configStorage.setCorpSecret(a.getSecret());
-            configStorage.setToken(a.getToken());
-            configStorage.setAesKey(a.getAesKey());
-            val service = new WxCpServiceImpl();
-            service.setWxCpConfigStorage(configStorage);
-            routers.put(a.getAgentId(), this.newRouter(service));
-            return service;
-        }).collect(Collectors.toMap(service -> service.getWxCpConfigStorage().getAgentId(), a -> a));
-    }
-
-    private WxCpMessageRouter newRouter(WxCpService wxCpService) {
-        final val newRouter = new WxCpMessageRouter(wxCpService);
-
-        // 璁板綍鎵�鏈変簨浠剁殑鏃ュ織 锛堝紓姝ユ墽琛岋級
-        newRouter.rule().handler(this.logHandler).next();
-
-        // 鑷畾涔夎彍鍗曚簨浠�
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxConsts.MenuButtonType.CLICK).handler(this.menuHandler).end();
-
-        // 鐐瑰嚮鑿滃崟閾炬帴浜嬩欢锛堣繖閲屼娇鐢ㄤ簡涓�涓┖鐨勫鐞嗗櫒锛屽彲浠ユ牴鎹嚜宸遍渶瑕佽繘琛屾墿灞曪級
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxConsts.MenuButtonType.VIEW).handler(this.nullHandler).end();
-
-        // 鍏虫敞浜嬩欢
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxConsts.EventType.SUBSCRIBE).handler(this.subscribeHandler)
-            .end();
-
-        // 鍙栨秷鍏虫敞浜嬩欢
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxConsts.EventType.UNSUBSCRIBE)
-            .handler(this.unsubscribeHandler).end();
-
-        // 涓婃姤鍦扮悊浣嶇疆浜嬩欢
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxConsts.EventType.LOCATION).handler(this.locationHandler)
-            .end();
-
-        // 鎺ユ敹鍦扮悊浣嶇疆娑堟伅
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION)
-            .handler(this.locationHandler).end();
-
-        // 鎵爜浜嬩欢锛堣繖閲屼娇鐢ㄤ簡涓�涓┖鐨勫鐞嗗櫒锛屽彲浠ユ牴鎹嚜宸遍渶瑕佽繘琛屾墿灞曪級
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxConsts.EventType.SCAN).handler(this.nullHandler).end();
-
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxCpConsts.EventType.CHANGE_CONTACT).handler(new ContactChangeHandler()).end();
-
-        newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
-            .event(WxCpConsts.EventType.ENTER_AGENT).handler(new EnterAgentHandler()).end();
-
-        // 榛樿
-        newRouter.rule().async(false).handler(this.msgHandler).end();
-
-        return newRouter;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxCpProperties.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxCpProperties.java
deleted file mode 100644
index 7b27f15..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxCpProperties.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.cofing;
-
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.List;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Data
-@ConfigurationProperties(prefix = "wechat.cp")
-public class WxCpProperties {
-  /**
-   * 璁剧疆浼佷笟寰俊鐨刢orpId
-   */
-  private String corpId;
-
-  private List<AppConfig> appConfigs;
-
-  @Getter
-  @Setter
-  public static class AppConfig {
-    /**
-     * 璁剧疆浼佷笟寰俊搴旂敤鐨凙gentId
-     */
-    private Integer agentId;
-
-    /**
-     * 璁剧疆浼佷笟寰俊搴旂敤鐨凷ecret
-     */
-    private String secret;
-
-    /**
-     * 璁剧疆浼佷笟寰俊搴旂敤鐨則oken
-     */
-    private String token;
-
-    /**
-     * 璁剧疆浼佷笟寰俊搴旂敤鐨凟ncodingAESKey
-     */
-    private String aesKey;
-
-  }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxMaConfiguration.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxMaConfiguration.java
deleted file mode 100644
index 5fdc06d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxMaConfiguration.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.ruoyi.system.cofing;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
-import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
-import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
-import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
-import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
-import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
-import com.google.common.collect.Lists;
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.error.WxRuntimeException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.io.File;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Admin
- */
-@Slf4j
-@Configuration
-@EnableConfigurationProperties(WxMaProperties.class)
-public class WxMaConfiguration {
-    private final WxMaProperties properties;
-
-    @Autowired
-    public WxMaConfiguration(WxMaProperties properties) {
-        this.properties = properties;
-    }
-
-    @Bean
-    public WxMaService wxMaService() {
-        List<WxMaProperties.Config> configs = this.properties.getConfigs();
-        if (configs == null) {
-            throw new WxRuntimeException("澶у摜锛屾嫓鎵樺厛鐪嬩笅椤圭洰棣栭〉鐨勮鏄庯紙readme鏂囦欢锛夛紝娣诲姞涓嬬浉鍏抽厤缃紝娉ㄦ剰鍒厤閿欎簡锛�");
-        }
-        WxMaService maService = new WxMaServiceImpl();
-        maService.setMultiConfigs(
-            configs.stream()
-                .map(a -> {
-                    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
-//                WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
-                    // 浣跨敤涓婇潰鐨勯厤缃椂锛岄渶瑕佸悓鏃跺紩鍏edis-lock鐨勪緷璧栵紝鍚﹀垯浼氭姤绫绘棤娉曟壘鍒扮殑寮傚父
-                    config.setAppid(a.getAppid());
-                    config.setSecret(a.getSecret());
-                    config.setToken(a.getToken());
-                    config.setAesKey(a.getAesKey());
-                    config.setMsgDataFormat(a.getMsgDataFormat());
-                    return config;
-                }).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o)));
-        return maService;
-    }
-
-    @Bean
-    public WxMaMessageRouter wxMaMessageRouter(WxMaService wxMaService) {
-        final WxMaMessageRouter router = new WxMaMessageRouter(wxMaService);
-        router
-            .rule().handler(logHandler).next()
-            .rule().async(false).content("璁㈤槄娑堟伅").handler(subscribeMsgHandler).end()
-            .rule().async(false).content("鏂囨湰").handler(textHandler).end()
-            .rule().async(false).content("鍥剧墖").handler(picHandler).end()
-            .rule().async(false).content("浜岀淮鐮�").handler(qrcodeHandler).end();
-        return router;
-    }
-
-    private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> {
-        service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder()
-            .templateId("姝ゅ鏇存崲涓鸿嚜宸辩殑妯℃澘id")
-            .data(Lists.newArrayList(
-                new WxMaSubscribeMessage.MsgData("keyword1", "339208499")))
-            .toUser(wxMessage.getFromUser())
-            .build());
-        return null;
-    };
-
-    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
-        log.info("鏀跺埌娑堟伅锛�" + wxMessage.toString());
-        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("鏀跺埌淇℃伅涓猴細" + wxMessage.toJson())
-            .toUser(wxMessage.getFromUser()).build());
-        return null;
-    };
-
-    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> {
-        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("鍥炲鏂囨湰娑堟伅")
-            .toUser(wxMessage.getFromUser()).build());
-        return null;
-    };
-
-    private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {
-        try {
-            WxMediaUploadResult uploadResult = service.getMediaService()
-                .uploadMedia("image", "png",
-                    ClassLoader.getSystemResourceAsStream("tmp.png"));
-            service.getMsgService().sendKefuMsg(
-                WxMaKefuMessage
-                    .newImageBuilder()
-                    .mediaId(uploadResult.getMediaId())
-                    .toUser(wxMessage.getFromUser())
-                    .build());
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    };
-
-    private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {
-        try {
-            final File file = service.getQrcodeService().createQrcode("123", 430);
-            WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
-            service.getMsgService().sendKefuMsg(
-                WxMaKefuMessage
-                    .newImageBuilder()
-                    .mediaId(uploadResult.getMediaId())
-                    .toUser(wxMessage.getFromUser())
-                    .build());
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    };
-
-}
-
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxMaProperties.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxMaProperties.java
deleted file mode 100644
index eb3ad06..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/cofing/WxMaProperties.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.ruoyi.system.cofing;
-
-/**
- * 寰俊灏忕▼搴忓睘鎬ч厤缃被
- *
- * @author: wangle
- * @date: 2023/5/18
- */
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.List;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Data
-@ConfigurationProperties(prefix = "wx.miniapp")
-public class WxMaProperties {
-
-    private List<Config> configs;
-
-    @Data
-    public static class Config {
-        /**
-         * 璁剧疆寰俊灏忕▼搴忕殑appid
-         */
-        private String appid;
-
-        /**
-         * 璁剧疆寰俊灏忕▼搴忕殑Secret
-         */
-        private String secret;
-
-        /**
-         * 璁剧疆寰俊灏忕▼搴忔秷鎭湇鍔″櫒閰嶇疆鐨則oken
-         */
-        private String token;
-
-        /**
-         * 璁剧疆寰俊灏忕▼搴忔秷鎭湇鍔″櫒閰嶇疆鐨凟ncodingAESKey
-         */
-        private String aesKey;
-
-        /**
-         * 娑堟伅鏍煎紡锛孹ML鎴栬�匤SON
-         */
-        private String msgDataFormat;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatConfigController.java
deleted file mode 100644
index a3db5ad..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatConfigController.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.web.core.BaseController;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 瀵硅瘽閰嶇疆淇℃伅
- *
- * @author Lion Li
- * @date 2024-04-13
- */
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/chat/config")
-public class ChatConfigController extends BaseController {
-
-    private final IChatConfigService chatConfigService;
-
-    private final ConfigService configService;
-
-    /**
-     * 鏌ヨ閰嶇疆淇℃伅鍒楄〃
-     */
-    @GetMapping("/list")
-    @SaCheckPermission("system:config:list")
-    public R<List<ChatConfigVo>> list(ChatConfigBo bo) {
-        return R.ok(chatConfigService.queryList(bo));
-    }
-
-    /**
-     * 鑾峰彇瀵硅瘽閰嶇疆淇¤缁嗕俊鎭�
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:config:list")
-    @GetMapping("/{id}")
-    public R<ChatConfigVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                   @PathVariable Long id) {
-        return R.ok(chatConfigService.queryById(id));
-    }
-
-    /**
-     * 鏍规嵁鍙傛暟閿悕鏌ヨ绯荤粺鍙傛暟鍊�
-     *
-     * @param configKey 鍙傛暟Key
-     */
-    @SaCheckPermission("system:config:list")
-    @GetMapping(value = "/configKey/{configKey}")
-    public R<String> getConfigKey(@PathVariable String configKey) {
-        return R.ok(configService.getConfigValue("sys",configKey));
-    }
-
-    /**
-     * 鏌ヨ鐗堟潈淇℃伅
-     *
-     */
-    @GetMapping(value = "/configKey/copyright")
-    public R<String> getConfigKeyCopyright() {
-        return R.ok(configService.getConfigValue("sys","copyright"));
-    }
-
-    /**
-     * 鏌ヨlogoImage
-     *
-     */
-    @GetMapping(value = "/configKey/logoImage")
-    public R<String> getConfigKeyLogoImage() {
-        return R.ok(configService.getConfigValue("sys","logoImage"));
-    }
-
-    /**
-     * 鏌ヨ绯荤粺鍙傛暟
-     *
-     */
-    @SaCheckPermission("system:config:list")
-    @GetMapping(value = "/sysConfigKey")
-    public R<List<ChatConfigVo>> getSysConfigKey() {
-        return R.ok(chatConfigService.getSysConfigValue("sys"));
-    }
-
-    /**
-     * 鏂板瀵硅瘽閰嶇疆淇℃伅
-     */
-    @SaCheckPermission("system:config:add")
-    @PostMapping("/add")
-    public R<Void> add(@RequestBody List<ChatConfigBo> boList) {
-        for (ChatConfigBo chatConfigBo : boList) {
-            if(chatConfigBo.getId() == null){
-                chatConfigService.insertByBo(chatConfigBo);
-            }else {
-                chatConfigService.updateByBo(chatConfigBo);
-            }
-        }
-        return toAjax(true);
-    }
-
-    /**
-     * 淇敼瀵硅瘽閰嶇疆淇℃伅
-     */
-    @SaCheckPermission("system:config:edit")
-    @PutMapping("/edit")
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ChatConfigBo bo) {
-        return toAjax(chatConfigService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎瀵硅瘽閰嶇疆淇℃伅
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:config:edit")
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(chatConfigService.deleteWithValidByIds(List.of(ids), true));
-    }
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatGptsController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatGptsController.java
deleted file mode 100644
index 96e5b19..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatGptsController.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.web.core.BaseController;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * gpts绠$悊
- *
- * @author Lion Li
- * @date 2024-07-09
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/gpts")
-public class ChatGptsController extends BaseController {
-
-    private final IChatGptsService chatGptsService;
-
-    /**
-     * 鏌ヨgpts绠$悊鍒楄〃
-     */
-    @GetMapping("/list")
-    public TableDataInfo<ChatGptsVo> list(ChatGptsBo bo, PageQuery pageQuery) {
-        return chatGptsService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭gpts绠$悊鍒楄〃
-     */
-    @SaCheckPermission("system:gpts:export")
-    @Log(title = "gpts绠$悊", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(ChatGptsBo bo, HttpServletResponse response) {
-        List<ChatGptsVo> list = chatGptsService.queryList(bo);
-        ExcelUtil.exportExcel(list, "gpts绠$悊", ChatGptsVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇gpts绠$悊璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:gpts:query")
-    @GetMapping("/{id}")
-    public R<ChatGptsVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(chatGptsService.queryById(id));
-    }
-
-    /**
-     * 鏂板gpts绠$悊
-     */
-    @SaCheckPermission("system:gpts:add")
-    @Log(title = "gpts绠$悊", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody ChatGptsBo bo) {
-        return toAjax(chatGptsService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼gpts绠$悊
-     */
-    @SaCheckPermission("system:gpts:edit")
-    @Log(title = "gpts绠$悊", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ChatGptsBo bo) {
-        return toAjax(chatGptsService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎gpts绠$悊
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:gpts:remove")
-    @Log(title = "gpts绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(chatGptsService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatMessageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatMessageController.java
deleted file mode 100644
index 5d0486d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatMessageController.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.common.web.core.BaseController;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 鑱婂ぉ娑堟伅
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/message")
-public class ChatMessageController extends BaseController {
-
-    private final IChatMessageService chatMessageService;
-
-    /**
-     * 鏌ヨ鑱婂ぉ娑堟伅鍒楄〃
-     */
-    @SaCheckPermission("system:message:list")
-    @GetMapping("/list")
-    public TableDataInfo<ChatMessageVo> list(ChatMessageBo bo, PageQuery pageQuery) {
-        pageQuery.setOrderByColumn("createTime");
-        pageQuery.setIsAsc("desc");
-        return chatMessageService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 鏌ヨ鎴戠殑鑱婂ぉ娑堟伅鍒楄〃
-     */
-    @GetMapping("/listByUser")
-    public R<TableDataInfo<ChatMessageVo>> listByUser(ChatMessageBo bo, PageQuery pageQuery) {
-        bo.setUserId(LoginHelper.getUserId());
-        pageQuery.setOrderByColumn("createTime");
-        pageQuery.setIsAsc("desc");
-        return R.ok(chatMessageService.queryPageList(bo, pageQuery));
-    }
-
-    /**
-     * 瀵煎嚭鑱婂ぉ娑堟伅鍒楄〃
-     */
-    @SaCheckPermission("system:message:export")
-    @Log(title = "鑱婂ぉ娑堟伅", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(ChatMessageBo bo, HttpServletResponse response) {
-        List<ChatMessageVo> list = chatMessageService.queryList(bo);
-        ExcelUtil.exportExcel(list, "鑱婂ぉ娑堟伅", ChatMessageVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇鑱婂ぉ娑堟伅璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:message:query")
-    @GetMapping("/{id}")
-    public R<ChatMessageVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(chatMessageService.queryById(id));
-    }
-
-    /**
-     * 鏂板鑱婂ぉ娑堟伅
-     */
-    @SaCheckPermission("system:message:add")
-    @Log(title = "鑱婂ぉ娑堟伅", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody ChatMessageBo bo) {
-        return toAjax(chatMessageService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼鑱婂ぉ娑堟伅
-     */
-    @SaCheckPermission("system:message:edit")
-    @Log(title = "鑱婂ぉ娑堟伅", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ChatMessageBo bo) {
-        return toAjax(chatMessageService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎鑱婂ぉ娑堟伅
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:message:remove")
-    @Log(title = "鑱婂ぉ娑堟伅", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(chatMessageService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatPluginController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatPluginController.java
deleted file mode 100644
index a0d9a1b..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatPluginController.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-
-/**
- * 鎻掍欢绠$悊
- *
- * @author ageerle
- * @date 2025-03-30
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/plugin")
-public class ChatPluginController extends BaseController {
-
-    private final IChatPluginService chatPluginService;
-
-    /**
-     * 鏌ヨ鎻掍欢绠$悊鍒楄〃
-     */
-    @SaCheckPermission("system:plugin:list")
-    @GetMapping("/list")
-    public TableDataInfo<ChatPluginVo> list(ChatPluginBo bo, PageQuery pageQuery) {
-        return chatPluginService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭鎻掍欢绠$悊鍒楄〃
-     */
-    @SaCheckPermission("system:plugin:export")
-    @Log(title = "鎻掍欢绠$悊", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(ChatPluginBo bo, HttpServletResponse response) {
-        List<ChatPluginVo> list = chatPluginService.queryList(bo);
-        ExcelUtil.exportExcel(list, "鎻掍欢绠$悊", ChatPluginVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇鎻掍欢绠$悊璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:plugin:query")
-    @GetMapping("/{id}")
-    public R<ChatPluginVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(chatPluginService.queryById(id));
-    }
-
-    /**
-     * 鏂板鎻掍欢绠$悊
-     */
-    @SaCheckPermission("system:plugin:add")
-    @Log(title = "鎻掍欢绠$悊", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody ChatPluginBo bo) {
-        return toAjax(chatPluginService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼鎻掍欢绠$悊
-     */
-    @SaCheckPermission("system:plugin:edit")
-    @Log(title = "鎻掍欢绠$悊", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ChatPluginBo bo) {
-        return toAjax(chatPluginService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎鎻掍欢绠$悊
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:plugin:remove")
-    @Log(title = "鎻掍欢绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(chatPluginService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatStoreController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatStoreController.java
deleted file mode 100644
index 532fb33..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatStoreController.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.web.core.BaseController;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 搴旂敤鍟嗗簵
- *
- * @author Lion Li
- * @date 2024-03-19
- */
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/store")
-public class ChatStoreController extends BaseController {
-
-    private final IChatAppStoreService appStoreService;
-
-    /**
-     * 搴旂敤鍟嗗簵
-     */
-    @GetMapping("/appList")
-    public R<List<ChatAppStoreVo>> appList(ChatAppStoreBo bo) {
-        return R.ok(appStoreService.queryList(bo));
-    }
-
-    /**
-     * 鏀惰棌搴旂敤
-     */
-    @PostMapping("/copyApp")
-    public R<String> copyApp() {
-        return R.ok();
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatVisitorUsageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatVisitorUsageController.java
deleted file mode 100644
index f402278..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatVisitorUsageController.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.web.core.BaseController;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 璁垮绠$悊
- *
- * @author Lion Li
- * @date 2024-07-14
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/visitorUsage")
-public class ChatVisitorUsageController extends BaseController {
-
-    private final IChatVisitorUsageService chatVisitorUsageService;
-
-    /**
-     * 鏌ヨ璁垮绠$悊鍒楄〃
-     */
-    @SaCheckPermission("system:visitorUsage:list")
-    @GetMapping("/list")
-    public TableDataInfo<ChatVisitorUsageVo> list(ChatVisitorUsageBo bo, PageQuery pageQuery) {
-        return chatVisitorUsageService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭璁垮绠$悊鍒楄〃
-     */
-    @SaCheckPermission("system:visitorUsage:export")
-    @Log(title = "璁垮绠$悊", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(ChatVisitorUsageBo bo, HttpServletResponse response) {
-        List<ChatVisitorUsageVo> list = chatVisitorUsageService.queryList(bo);
-        ExcelUtil.exportExcel(list, "璁垮绠$悊", ChatVisitorUsageVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇璁垮绠$悊璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:visitorUsage:query")
-    @GetMapping("/{id}")
-    public R<ChatVisitorUsageVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(chatVisitorUsageService.queryById(id));
-    }
-
-    /**
-     * 鏂板璁垮绠$悊
-     */
-    @SaCheckPermission("system:visitorUsage:add")
-    @Log(title = "璁垮绠$悊", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody ChatVisitorUsageBo bo) {
-        return toAjax(chatVisitorUsageService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼璁垮绠$悊
-     */
-    @SaCheckPermission("system:visitorUsage:edit")
-    @Log(title = "璁垮绠$悊", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ChatVisitorUsageBo bo) {
-        return toAjax(chatVisitorUsageService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎璁垮绠$悊
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:visitorUsage:remove")
-    @Log(title = "璁垮绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(chatVisitorUsageService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatVoucherController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatVoucherController.java
deleted file mode 100644
index 88cc4f4..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatVoucherController.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.common.wechat.web.utils.UUIDShortUtil;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 鐢ㄦ埛鍏戞崲璁板綍
- *
- * @author Lion Li
- * @date 2024-05-03
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/voucher")
-public class ChatVoucherController extends BaseController {
-
-    private final IChatVoucherService chatVoucherService;
-
-    /**
-     * 鏌ヨ鐢ㄦ埛鍏戞崲璁板綍鍒楄〃
-     */
-    @SaCheckPermission("system:voucher:list")
-    @GetMapping("/list")
-    public TableDataInfo<ChatVoucherVo> list(ChatVoucherBo bo, PageQuery pageQuery) {
-        return chatVoucherService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭鐢ㄦ埛鍏戞崲璁板綍鍒楄〃
-     */
-    @SaCheckPermission("system:voucher:export")
-    @Log(title = "鐢ㄦ埛鍏戞崲璁板綍", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(ChatVoucherBo bo, HttpServletResponse response) {
-        List<ChatVoucherVo> list = chatVoucherService.queryList(bo);
-        ExcelUtil.exportExcel(list, "鐢ㄦ埛鍏戞崲璁板綍", ChatVoucherVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇鐢ㄦ埛鍏戞崲璁板綍璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:voucher:query")
-    @GetMapping("/{id}")
-    public R<ChatVoucherVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(chatVoucherService.queryById(id));
-    }
-
-    /**
-     * 鏂板鐢ㄦ埛鍏戞崲璁板綍
-     */
-    @SaCheckPermission("system:voucher:add")
-    @Log(title = "鐢ㄦ埛鍏戞崲璁板綍", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody ChatVoucherBo bo) {
-        bo.setCode(UUIDShortUtil.generateShortUuid());
-        return toAjax(chatVoucherService.insertByBo(bo));
-    }
-
-    /**
-     * 鍏戞崲鍗″瘑
-     *
-     * @param bo 鍗″瘑淇℃伅
-     * @return 鏄惁鍏戞崲鎴愬姛
-     */
-    @PostMapping("/redeem")
-    public R<String> redeem(@RequestBody ChatVoucherBo bo) {
-        if(chatVoucherService.redeem(bo)){
-            return R.ok("鍏戞崲鎴愬姛!");
-        }else {
-            return R.fail("鍏戞崲澶辫触,璇疯仈绯荤鐞嗗憳!");
-        }
-    }
-
-    /**
-     * 淇敼鐢ㄦ埛鍏戞崲璁板綍
-     */
-    @SaCheckPermission("system:voucher:edit")
-    @Log(title = "鐢ㄦ埛鍏戞崲璁板綍", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ChatVoucherBo bo) {
-        return toAjax(chatVoucherService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎鐢ㄦ埛鍏戞崲璁板綍
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:voucher:remove")
-    @Log(title = "鐢ㄦ埛鍏戞崲璁板綍", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(chatVoucherService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/KnowledgeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/KnowledgeController.java
deleted file mode 100644
index 3ea10af..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/KnowledgeController.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//package org.ruoyi.system.controller.system;
-//
-//import cn.dev33.satoken.stp.StpUtil;
-//import jakarta.servlet.http.HttpServletRequest;
-//import jakarta.servlet.http.HttpServletResponse;
-//import jakarta.validation.Valid;
-//import jakarta.validation.constraints.NotEmpty;
-//import jakarta.validation.constraints.NotNull;
-//import lombok.RequiredArgsConstructor;
-//import org.ruoyi.common.chat.domain.request.ChatRequest;
-//import org.ruoyi.common.chat.entity.chat.Message;
-//import org.ruoyi.common.core.domain.R;
-//import org.ruoyi.common.core.validate.AddGroup;
-//import org.ruoyi.common.excel.utils.ExcelUtil;
-//import org.ruoyi.common.log.annotation.Log;
-//import org.ruoyi.common.log.enums.BusinessType;
-//import org.ruoyi.common.mybatis.core.page.PageQuery;
-//import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-//import org.ruoyi.common.satoken.utils.LoginHelper;
-//import org.ruoyi.common.web.core.BaseController;
-//import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
-//import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
-//import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
-//import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
-//import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
-//import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
-//import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
-//import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
-//import org.ruoyi.knowledge.service.EmbeddingService;
-//import org.ruoyi.knowledge.service.IKnowledgeAttachService;
-//import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
-//import org.ruoyi.knowledge.service.IKnowledgeInfoService;
-//import org.ruoyi.system.service.ISseService;
-//import org.springframework.validation.annotation.Validated;
-//import org.springframework.web.bind.annotation.*;
-//import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-//
-//import java.util.List;
-//
-//
-///**
-// * 鐭ヨ瘑搴�
-// *
-// * @author Lion Li
-// * @date 2024-10-21
-// */
-//@Validated
-//@RequiredArgsConstructor
-//@RestController
-//@RequestMapping("/knowledge")
-//public class KnowledgeController extends BaseController {
-//
-//    private final IKnowledgeInfoService knowledgeInfoService;
-//
-//    private final VectorStore vectorStore;
-//
-//    private final IKnowledgeAttachService attachService;
-//
-//    private final IKnowledgeFragmentService fragmentService;
-//
-//    private final EmbeddingService embeddingService;
-//
-//    private final ISseService sseService;
-//
-//    /**
-//     * 鐭ヨ瘑搴撳璇�
-//     */
-//    @PostMapping("/send")
-//    public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
-//        List<Message> messages = chatRequest.getMessages();
-//        // 鑾峰彇鐭ヨ瘑搴撲俊鎭�
-//        Message message = messages.get(messages.size() - 1);
-//        StringBuilder sb = new StringBuilder(message.getContent().toString());
-//        List<String> nearestList;
-//        List<Double> queryVector = embeddingService.getQueryVector(message.getContent().toString(), chatRequest.getKid());
-//        nearestList = vectorStore.nearest(queryVector, chatRequest.getKid());
-//        for (String prompt : nearestList) {
-//            sb.append("\n####").append(prompt);
-//        }
-//        sb.append( (nearestList.size() > 0 ? "\n\n娉ㄦ剰锛氬洖绛旈棶棰樻椂锛岄』涓ユ牸鏍规嵁鎴戠粰浣犵殑绯荤粺涓婁笅鏂囧唴瀹瑰師鏂囪繘琛屽洖绛旓紝璇蜂笉瑕佽嚜宸卞彂鎸�,鍥炵瓟鏃朵繚鎸佸師鏉ユ枃鏈殑娈佃惤灞傜骇" : ""));
-//        message.setContent(sb.toString());
-//        return sseService.sseChat(chatRequest, request);
-//    }
-//
-//    /**
-//     * 鏍规嵁鐢ㄦ埛淇℃伅鏌ヨ鏈湴鐭ヨ瘑搴�
-//     */
-//    @GetMapping("/list")
-//    public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
-//        if(!StpUtil.isLogin()){
-//            return null;
-//        }
-//        bo.setUid(LoginHelper.getUserId());
-//        return knowledgeInfoService.queryPageList(bo, pageQuery);
-//    }
-//
-//    /**
-//     * 鏂板鐭ヨ瘑搴�
-//     */
-//    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.INSERT)
-//    @PostMapping("/save")
-//    public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
-//        knowledgeInfoService.saveOne(bo);
-//        return R.ok();
-//    }
-//
-//    /**
-//     * 鍒犻櫎鐭ヨ瘑搴�
-//     */
-//    @PostMapping("/remove/{id}")
-//    public R<String> remove(@PathVariable String id){
-//        knowledgeInfoService.removeKnowledge(id);
-//        return R.ok("鍒犻櫎鐭ヨ瘑搴撴垚鍔�!");
-//    }
-//
-//    /**
-//     * 淇敼鐭ヨ瘑搴�
-//     */
-//    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.UPDATE)
-//    @PostMapping("/edit")
-//    public R<Void> edit( @RequestBody KnowledgeInfoBo bo) {
-//        return toAjax(knowledgeInfoService.updateByBo(bo));
-//    }
-//
-//    /**
-//     * 瀵煎嚭鐭ヨ瘑搴撳垪琛�
-//     */
-//    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.EXPORT)
-//    @PostMapping("/export")
-//    public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
-//        List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
-//        ExcelUtil.exportExcel(list, "鐭ヨ瘑搴�", KnowledgeInfoVo.class, response);
-//    }
-//
-//    /**
-//     * 鏌ヨ鐭ヨ瘑闄勪欢淇℃伅
-//     */
-//    @GetMapping("/detail/{kid}")
-//    public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,@PathVariable String kid){
-//        bo.setKid(kid);
-//        return attachService.queryPageList(bo, pageQuery);
-//    }
-//
-//    /**
-//     * 涓婁紶鐭ヨ瘑搴撻檮浠�
-//     */
-//    @PostMapping(value = "/attach/upload")
-//    public R<String> upload(KnowledgeInfoUploadRequest request){
-//        knowledgeInfoService.upload(request);
-//        return R.ok("涓婁紶鐭ヨ瘑搴撻檮浠舵垚鍔�!");
-//    }
-//
-//    /**
-//     * 鑾峰彇鐭ヨ瘑搴撻檮浠惰缁嗕俊鎭�
-//     *
-//     * @param id 涓婚敭
-//     */
-//    @GetMapping("attach/info/{id}")
-//    public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-//                                              @PathVariable Long id) {
-//        return R.ok(attachService.queryById(id));
-//    }
-//
-//    /**
-//     * 鍒犻櫎鐭ヨ瘑搴撻檮浠�
-//     *
-//     */
-//    @PostMapping("attach/remove/{docId}")
-//    public R<Void> removeAttach(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖") @PathVariable String docId) {
-//        attachService.removeKnowledgeAttach(docId);
-//        return R.ok();
-//    }
-//
-//
-//    /**
-//     * 鏌ヨ鐭ヨ瘑鐗囨
-//     */
-//    @GetMapping("/fragment/list/{docId}")
-//    public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
-//        bo.setDocId(docId);
-//        return fragmentService.queryPageList(bo, pageQuery);
-//    }
-//
-//}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/PayController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/PayController.java
deleted file mode 100644
index eef8331..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/PayController.java
+++ /dev/null
@@ -1,333 +0,0 @@
-//package org.ruoyi.system.controller.system;
-//
-//import cn.hutool.core.bean.BeanUtil;
-//import cn.hutool.core.collection.CollectionUtil;
-//import cn.hutool.extra.qrcode.QrCodeUtil;
-//import cn.hutool.json.JSONObject;
-//import cn.hutool.json.JSONUtil;
-//import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
-//import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
-//import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
-//import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
-//import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-//import com.github.binarywang.wxpay.exception.WxPayException;
-//import com.github.binarywang.wxpay.service.WxPayService;
-//import com.stripe.Stripe;
-//import com.stripe.exception.StripeException;
-//import com.stripe.model.Event;
-//import com.stripe.model.Price;
-//import com.stripe.model.Product;
-//import com.stripe.model.checkout.Session;
-//import com.stripe.net.Webhook;
-//import com.stripe.param.checkout.SessionCreateParams;
-//import jakarta.servlet.http.HttpServletRequest;
-//import lombok.RequiredArgsConstructor;
-//import lombok.extern.slf4j.Slf4j;
-//import org.ruoyi.common.config.PayConfig;
-//import org.ruoyi.common.core.domain.R;
-//import org.ruoyi.common.core.exception.base.BaseException;
-//import org.ruoyi.common.core.service.ConfigService;
-//import org.ruoyi.common.core.utils.StringUtils;
-//import org.ruoyi.common.oss.core.OssClient;
-//import org.ruoyi.common.oss.entity.UploadResult;
-//import org.ruoyi.common.oss.factory.OssFactory;
-//import org.ruoyi.common.response.PayResponse;
-//import org.ruoyi.common.service.PayService;
-//import org.ruoyi.common.utils.MD5Util;
-//import org.ruoyi.system.domain.bo.PaymentOrdersBo;
-//import org.ruoyi.system.domain.bo.SysUserBo;
-//import org.ruoyi.system.domain.request.OrderRequest;
-//import org.ruoyi.system.domain.vo.PaymentOrdersVo;
-//import org.ruoyi.system.domain.vo.SysUserVo;
-//import org.ruoyi.system.service.IPaymentOrdersService;
-//import org.ruoyi.system.service.ISysUserService;
-//import org.springframework.web.bind.annotation.*;
-//
-//import java.io.ByteArrayOutputStream;
-//import java.io.InputStream;
-//import java.math.BigDecimal;
-//import java.math.RoundingMode;
-//import java.util.HashMap;
-//import java.util.List;
-//import java.util.Map;
-//
-//
-//@RequiredArgsConstructor
-//@RestController
-//@RequestMapping("/pay")
-//@Slf4j
-//public class PayController {
-//
-//    private final PayService payService;
-//
-//    private final ISysUserService userService;
-//
-//    private final IPaymentOrdersService paymentOrdersService;
-//
-//    private final PayConfig payConfig;
-//
-//    private final WxPayService wxService;
-//
-//    private final ConfigService configService;
-//
-//    /**
-//     * 鑾峰彇鏀粯浜岀淮鐮�
-//     *
-//     * @Date 2023/7/3
-//     * @return void
-//     **/
-//    @PostMapping("/payUrl")
-//    public R<PaymentOrdersVo> payUrl(@RequestBody OrderRequest orderRequest) {
-//        PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
-//        PaymentOrdersVo paymentOrdersVo = new PaymentOrdersVo();
-//        if(!Boolean.parseBoolean(getKey("enabled"))){
-//            String payUrl = payService.getPayUrl(payOrder.getOrderNo(), orderRequest.getName(), Double.parseDouble(orderRequest.getMoney()), "192.168.1.6");
-//            byte[] bytes = QrCodeUtil.generatePng(payUrl, 300, 300);
-//            OssClient storage = OssFactory.instance();
-//            UploadResult upload=storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
-//            BeanUtil.copyProperties(payOrder,paymentOrdersVo);
-//            paymentOrdersVo.setUrl(upload.getUrl());
-//        }else {
-//            WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
-//            request.setTradeType("NATIVE");
-//            request.setBody(orderRequest.getName());
-//            request.setOutTradeNo(payOrder.getOrderNo());
-//            request.setTotalFee(BaseWxPayRequest.yuanToFen(orderRequest.getMoney()));
-//            request.setSpbillCreateIp("127.0.0.1");
-//            request.setNotifyUrl(getKey("notifyUrl"));
-//            request.setProductId(payOrder.getId().toString());
-//            try {
-//                WxPayNativeOrderResult order = wxService.createOrder(request);
-//                byte[] bytes = QrCodeUtil.generatePng(order.getCodeUrl(), 300, 300);
-//                OssClient storage = OssFactory.instance();
-//                UploadResult upload = storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
-//                BeanUtil.copyProperties(payOrder,paymentOrdersVo);
-//                paymentOrdersVo.setUrl(upload.getUrl());
-//            } catch (WxPayException e) {
-//                throw new BaseException("鑾峰彇寰俊鏀粯浜岀淮鐮佸彂鐢熼敊璇細{}"+e.getMessage());
-//            }
-//        }
-//        return R.ok(paymentOrdersVo);
-//    }
-//
-//    /**
-//     * 鍥炶皟閫氱煡鍦板潃
-//     *
-//     * @Date 2023/7/3
-//     * @param
-//     * @return void
-//     **/
-//    @GetMapping("/notifyUrl")
-//    public String notifyUrl(PayResponse payResponse) {
-//        // 鏍¢獙绛惧悕
-//        String mdString = "money=" + payResponse.getMoney() + "&name=" + payResponse.getName() +
-//            "&out_trade_no=" + payResponse.getOut_trade_no() + "&pid=" + payConfig.getPid() +
-//            "&trade_no=" + payResponse.getTrade_no() + "&trade_status=" + payResponse.getTrade_status() +
-//            "&type=" + payResponse.getType() +  payConfig.getKey();
-//        String sign = MD5Util.GetMD5Code(mdString);
-//        if(!sign.equals(payResponse.getSign())){
-//            throw new BaseException("鏍¢獙绛惧悕澶辫触锛�");
-//        }
-//        double money = Double.parseDouble(payResponse.getMoney());
-//        log.info("鏀粯璁㈠崟鍙穥}",payResponse);
-//        PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
-//        paymentOrdersBo.setOrderNo(payResponse.getOut_trade_no());
-//        List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
-//        if (CollectionUtil.isEmpty(paymentOrdersList)){
-//            throw new BaseException("璁㈠崟涓嶅瓨鍦紒");
-//        }
-//        // 璁㈠崟鐘舵�佷慨鏀逛负宸叉敮浠�
-//        PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
-//        paymentOrdersVo.setPaymentStatus("2");
-//        paymentOrdersVo.setPaymentMethod(payResponse.getType());
-//        BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
-//        paymentOrdersService.updateByBo(paymentOrdersBo);
-//
-//        SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
-//        sysUserVo.setUserBalance(sysUserVo.getUserBalance() + money);
-//        SysUserBo sysUserBo = new SysUserBo();
-//        BeanUtil.copyProperties(sysUserVo,sysUserBo);
-//        // 璁剧疆涓轰粯璐圭敤鎴�
-//        sysUserBo.setUserGrade("1");
-//        userService.updateUser(sysUserBo);
-//        return "success";
-//    }
-//
-//    /**
-//     * 璺宠浆閫氱煡鍦板潃
-//     *
-//     * @Date 2023/7/3
-//     * @param
-//     * @return void
-//     **/
-//    @GetMapping("/return_url")
-//    public void returnUrl() {
-//        log.info("return_url===========");
-//    }
-//
-//
-//    @PostMapping("/notify/wxOrder")
-//    public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
-//        WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
-//        // TODO 鏍规嵁鑷繁涓氬姟鍦烘櫙闇�瑕佹瀯閫犺繑鍥炲璞�
-//        PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
-//        paymentOrdersBo.setOrderNo(notifyResult.getOutTradeNo());
-//        List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
-//        PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
-//        paymentOrdersVo.setPaymentStatus("2");
-//        paymentOrdersVo.setPaymentMethod("wx");
-//        BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
-//        paymentOrdersService.updateByBo(paymentOrdersBo);
-//        SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
-//        sysUserVo.setUserBalance(sysUserVo.getUserBalance() + convertCentsToYuan(notifyResult.getTotalFee()));
-//        SysUserBo sysUserBo = new SysUserBo();
-//        BeanUtil.copyProperties(sysUserVo,sysUserBo);
-//        // 璁剧疆涓轰粯璐圭敤鎴�
-//        sysUserBo.setUserGrade("1");
-//        userService.updateUser(sysUserBo);
-//        return WxPayNotifyResponse.success("success");
-//    }
-//
-//    /**
-//     * 灏嗗垎杞崲涓哄厓锛屽苟淇濈暀绮惧害銆�
-//     *
-//     * @param cents 鍒嗙殑閲戦锛岀被鍨嬩负Integer
-//     * @return 杞崲鍚庣殑鍏冮噾棰濓紝绫诲瀷涓篸ouble
-//     */
-//    public static double convertCentsToYuan(Integer cents) {
-//        // 澶勭悊绌鸿緭鍏�
-//        if (cents == null) {
-//            throw new IllegalArgumentException("杈撳叆鐨勫垎閲戦涓嶈兘涓虹┖");
-//        }
-//
-//        // 100鍒� = 1鍏�
-//        BigDecimal centsBigDecimal = new BigDecimal(cents);
-//        BigDecimal yuan = centsBigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
-//        // 杞崲涓篸ouble骞惰繑鍥�
-//        return yuan.doubleValue();
-//    }
-//
-//    /**
-//     * 鑾峰彇璁㈠崟淇℃伅
-//     *
-//     */
-//    @PostMapping("/orderInfo")
-//    public R<PaymentOrdersVo> orderInfo(@RequestBody  OrderRequest orderRequest) {
-//        if(StringUtils.isEmpty(orderRequest.getOrderNo())){
-//            throw new BaseException("璁㈠崟鍙蜂笉鑳戒负绌猴紒");
-//        }
-//        PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
-//        paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
-//        List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
-//        if (CollectionUtil.isEmpty(paymentOrdersList)){
-//            throw new BaseException("璁㈠崟涓嶅瓨鍦紒");
-//        }
-//        PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
-//        return R.ok(paymentOrdersVo);
-//    }
-//
-//    // 鑾峰彇鏀粯閾炬帴
-////    static {
-////        Stripe.apiKey = "sk_test_51PMMj2KcfX4oNioqXkoKpScTsgmR55xQki2tg8MEZJYc0gjhYV85t2FzDasE06eqZb0sqyYhOp3UXhcGGQLWI4A9008aq8SOnb";
-////    }
-//
-//    /**
-//     *   鍘绘敮浠�
-//     * 1銆佸垱寤轰骇鍝�
-//     * 2銆佽缃环鏍�
-//     * 3銆佸垱寤烘敮浠樹俊鎭� 寰楀埌url
-//     * @return
-//     */
-//    @PostMapping("/stripePay")
-//    public String pay(@RequestBody OrderRequest orderRequest) throws StripeException {
-//
-//        String enabled = configService.getConfigValue("stripe", "enabled");
-//        if(!Boolean.parseBoolean(enabled)){
-//            String prompt = configService.getConfigValue("stripe", "prompt");
-//            throw new BaseException(prompt);
-//        }
-//
-//        // 鑾峰彇鏀粯閾炬帴
-//        Stripe.apiKey = configService.getConfigValue("stripe", "key");
-//
-//        // 鑾峰彇閲戦瀛楃涓插苟瑙f瀽涓� double
-//        double moneyDouble = Double.parseDouble(orderRequest.getMoney());
-//
-//        // 灏嗛噾棰濊浆鎹负浠ュ垎涓哄崟浣嶇殑鏁存暟
-//        int randMoney = (int) (moneyDouble * 100);
-//
-//        Map<String, Object> params = new HashMap<>();
-//        params.put("name", orderRequest.getName());
-//        Product product = Product.create(params);
-//
-//        Map<String, Object> recurring = new HashMap<>();
-//        recurring.put("interval", "month");
-//        Map<String, Object> params2 = new HashMap<>();
-//        params2.put("unit_amount", randMoney);
-//        params2.put("currency", "usd");
-//        params2.put("recurring", recurring);
-//        params2.put("product", product.getId());
-//        Price price = Price.create(params2);
-//
-//        // 鍒涘缓鏀粯璁㈠崟
-//        PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
-//
-//        //鍒涘缓鏀粯淇℃伅 寰楀埌url
-//        SessionCreateParams params3 = SessionCreateParams.builder()
-//            .setMode(SessionCreateParams.Mode.SUBSCRIPTION)
-//            .setSuccessUrl(configService.getConfigValue("stripe", "success"))
-//            .setCancelUrl(configService.getConfigValue("stripe", "cancel"))
-//            .addLineItem(
-//                SessionCreateParams.LineItem.builder()
-//                    .setQuantity(1L)
-//                    .setPrice(price.getId())
-//                    .build()).putMetadata("orderId", payOrder.getOrderNo())
-//            .build();
-//        Session session = Session.create(params3);
-//        return session.getUrl();
-//    }
-//
-//    /**
-//     *  鏀粯鍥炶皟
-//     *
-//     */
-//    @PostMapping("/stripe_events")
-//    public R<String> stripeEvent(HttpServletRequest request) {
-//        try {
-//            String endpointSecret = configService.getConfigValue("stripe", "secret");//webhook绉橀挜绛惧悕
-//            InputStream inputStream = request.getInputStream();
-//            ByteArrayOutputStream output = new ByteArrayOutputStream();
-//            byte[] buffer = new byte[1024*4];
-//            int n = 0;
-//            while (-1 != (n = inputStream.read(buffer))) {
-//                output.write(buffer, 0, n);
-//            }
-//            byte[] bytes = output.toByteArray();
-//            String payload = new String(bytes, "UTF-8");
-//            String sigHeader = request.getHeader("Stripe-Signature");
-//            Event event = Webhook.constructEvent(payload, sigHeader, endpointSecret);//楠岀锛屽苟鑾峰彇浜嬩欢
-//            if("checkout.session.completed".equals(event.getType())){
-//                // 瑙f瀽 JSON 瀛楃涓蹭负 JSONObject
-//                JSONObject jsonObject = JSONUtil.parseObj(event);
-//                // 鑾峰彇 metadata 瀵硅薄
-//                JSONObject metadata = jsonObject.getJSONObject("data")
-//                    .getJSONObject("object")
-//                    .getJSONObject("metadata");
-//
-//                OrderRequest orderRequest = new OrderRequest();
-//                orderRequest.setPayType("stripe");
-//                orderRequest.setOrderNo(metadata.getStr("orderId"));
-//                paymentOrdersService.updatePayOrder(orderRequest);
-//            }
-//        } catch (Exception e) {
-//            System.out.println("stripe寮傛閫氱煡锛坵ebhook浜嬩欢锛�"+e);
-//        }
-//        return R.ok();
-//    }
-//
-//    public String getKey(String key) {
-//        return configService.getConfigValue("weixin", key);
-//    }
-//
-//}
-//
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/PaymentOrdersController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/PaymentOrdersController.java
deleted file mode 100644
index eebfa8e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/PaymentOrdersController.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.system.domain.bo.PaymentOrdersBo;
-import org.ruoyi.system.domain.vo.PaymentOrdersVo;
-import org.ruoyi.system.service.IPaymentOrdersService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 鏀粯璁㈠崟
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/payOrder")
-public class PaymentOrdersController extends BaseController {
-
-    private final IPaymentOrdersService paymentOrdersService;
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟鍒楄〃
-     */
-    @SaCheckPermission("system:order:list")
-    @GetMapping("/list")
-    public TableDataInfo<PaymentOrdersVo> list(PaymentOrdersBo bo, PageQuery pageQuery) {
-        pageQuery.setOrderByColumn("createTime");
-        pageQuery.setIsAsc("desc");
-        return paymentOrdersService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭鏀粯璁㈠崟鍒楄〃
-     */
-    @SaCheckPermission("system:order:export")
-    @Log(title = "鏀粯璁㈠崟", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(PaymentOrdersBo bo, HttpServletResponse response) {
-        List<PaymentOrdersVo> list = paymentOrdersService.queryList(bo);
-        ExcelUtil.exportExcel(list, "鏀粯璁㈠崟", PaymentOrdersVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇鏀粯璁㈠崟璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:order:query")
-    @GetMapping("/{id}")
-    public R<PaymentOrdersVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(paymentOrdersService.queryById(id));
-    }
-
-    /**
-     * 鏂板鏀粯璁㈠崟
-     */
-    @SaCheckPermission("system:order:add")
-    @Log(title = "鏀粯璁㈠崟", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody PaymentOrdersBo bo) {
-        return toAjax(paymentOrdersService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼鏀粯璁㈠崟
-     */
-    @SaCheckPermission("system:order:edit")
-    @Log(title = "鏀粯璁㈠崟", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PaymentOrdersBo bo) {
-        return toAjax(paymentOrdersService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎鏀粯璁㈠崟
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:order:remove")
-    @Log(title = "鏀粯璁㈠崟", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(paymentOrdersService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysModelController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysModelController.java
deleted file mode 100644
index 9f7760e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysModelController.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.system.domain.bo.SysModelBo;
-import org.ruoyi.system.domain.bo.SysPackagePlanBo;
-import org.ruoyi.system.domain.vo.SysModelVo;
-import org.ruoyi.system.domain.vo.SysPackagePlanVo;
-import org.ruoyi.system.domain.vo.SysUserVo;
-import org.ruoyi.system.service.ISysModelService;
-import org.ruoyi.system.service.ISysPackagePlanService;
-import org.ruoyi.system.service.ISysUserService;
-import org.ruoyi.system.util.DesensitizationUtil;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 绯荤粺妯″瀷
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/model")
-public class SysModelController extends BaseController {
-
-    private final ISysModelService sysModelService;
-
-    private final ISysPackagePlanService sysPackagePlanService;
-
-    private final ISysUserService userService;
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷鍒楄〃 - 鍏ㄩ儴
-     */
-    @GetMapping("/list")
-    public TableDataInfo<SysModelVo> list(SysModelBo bo, PageQuery pageQuery) {
-        return sysModelService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷鍒楄〃
-     */
-    @GetMapping("/modelList")
-    public R<List<SysModelVo>> modelList(SysModelBo bo) {
-        bo.setModelShow("0");
-        List<SysModelVo> sysModelVos = sysModelService.queryList(bo);
-        SysPackagePlanBo sysPackagePlanBo = new SysPackagePlanBo();
-        if (StpUtil.isLogin()) {
-            Long userId = LoginHelper.getLoginUser().getUserId();
-            SysUserVo sysUserVo = userService.selectUserById(userId);
-            if ("0".equals(sysUserVo.getUserGrade())){
-                sysPackagePlanBo.setName("Free");
-                SysPackagePlanVo sysPackagePlanVo = sysPackagePlanService.queryList(sysPackagePlanBo).get(0);
-                List<String> array = new ArrayList<>(Arrays.asList(sysPackagePlanVo.getPlanDetail().split(",")));
-                sysModelVos.removeIf(model -> !array.contains(model.getModelName()));
-            }
-        }else {
-            sysPackagePlanBo.setName("Visitor");
-            SysPackagePlanVo sysPackagePlanVo = sysPackagePlanService.queryList(sysPackagePlanBo).get(0);
-            List<String> array = new ArrayList<>(Arrays.asList(sysPackagePlanVo.getPlanDetail().split(",")));
-            sysModelVos.removeIf(model -> !array.contains(model.getModelName()));
-        }
-        sysModelVos.stream().map(vo -> {
-                    String maskedApiHost = DesensitizationUtil.maskData(vo.getApiHost());
-                    String maskedApiKey = DesensitizationUtil.maskData(vo.getApiKey());
-                    vo.setApiHost(maskedApiHost);
-                    vo.setApiKey(maskedApiKey);
-                    return vo;
-                })
-                .collect(Collectors.toList());
-        return R.ok(sysModelVos);
-    }
-
-    /**
-     * 瀵煎嚭绯荤粺妯″瀷鍒楄〃
-     */
-    @SaCheckPermission("system:model:export")
-    @Log(title = "绯荤粺妯″瀷", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(SysModelBo bo, HttpServletResponse response) {
-        List<SysModelVo> list = sysModelService.queryList(bo);
-        ExcelUtil.exportExcel(list, "绯荤粺妯″瀷", SysModelVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇绯荤粺妯″瀷璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:model:query")
-    @GetMapping("/{id}")
-    public R<SysModelVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(sysModelService.queryById(id));
-    }
-
-    /**
-     * 鏂板绯荤粺妯″瀷
-     */
-    @SaCheckPermission("system:model:add")
-    @Log(title = "绯荤粺妯″瀷", businessType = BusinessType.INSERT)
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysModelBo bo) {
-        return toAjax(sysModelService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼绯荤粺妯″瀷
-     */
-    @SaCheckPermission("system:model:edit")
-    @Log(title = "绯荤粺妯″瀷", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysModelBo bo) {
-        return toAjax(sysModelService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎绯荤粺妯″瀷
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:model:remove")
-    @Log(title = "绯荤粺妯″瀷", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(sysModelService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysNoticeController.java
index 4f30a3a..a02568b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysNoticeController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysNoticeController.java
@@ -16,7 +16,7 @@
 import org.springframework.web.bind.annotation.*;
 
 /**
- * 鍏憡 淇℃伅鎿嶄綔澶勭悊
+ * 鍏憡淇℃伅鎿嶄綔澶勭悊
  *
  * @author Lion Li
  */
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysPackagePlanController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysPackagePlanController.java
deleted file mode 100644
index 068ffd6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysPackagePlanController.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import java.util.List;
-
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-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.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.log.enums.BusinessType;
-
-import org.ruoyi.system.domain.vo.SysPackagePlanVo;
-import org.ruoyi.system.domain.bo.SysPackagePlanBo;
-import org.ruoyi.system.service.ISysPackagePlanService;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-
-/**
- * 濂楅绠$悊
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/packagePlan")
-public class SysPackagePlanController extends BaseController {
-
-    private final ISysPackagePlanService sysPackagePlanService;
-
-    /**
-     * 鏌ヨ濂楅绠$悊鍒楄〃
-     */
-    @GetMapping("/list")
-    public TableDataInfo<SysPackagePlanVo> list(SysPackagePlanBo bo, PageQuery pageQuery) {
-        return sysPackagePlanService.queryPageList(bo, pageQuery);
-    }
-
-    @GetMapping("/listPlan")
-    public R<List<SysPackagePlanVo>> listPlan() {
-        return R.ok(sysPackagePlanService.queryList(new SysPackagePlanBo()));
-    }
-
-    /**
-     * 瀵煎嚭濂楅绠$悊鍒楄〃
-     */
-    @SaCheckPermission("system:packagePlan:export")
-    @Log(title = "濂楅绠$悊", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(SysPackagePlanBo bo, HttpServletResponse response) {
-        List<SysPackagePlanVo> list = sysPackagePlanService.queryList(bo);
-        ExcelUtil.exportExcel(list, "濂楅绠$悊", SysPackagePlanVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇濂楅绠$悊璇︾粏淇℃伅
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:packagePlan:query")
-    @GetMapping("/{id}")
-    public R<SysPackagePlanVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(sysPackagePlanService.queryById(id));
-    }
-
-
-
-
-    /**
-     * 鏂板濂楅绠$悊
-     */
-    @SaCheckPermission("system:packagePlan:add")
-    @Log(title = "濂楅绠$悊", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysPackagePlanBo bo) {
-        return toAjax(sysPackagePlanService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼濂楅绠$悊
-     */
-    @SaCheckPermission("system:packagePlan:edit")
-    @Log(title = "濂楅绠$悊", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysPackagePlanBo bo) {
-        return toAjax(sysPackagePlanService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎濂楅绠$悊
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:packagePlan:remove")
-    @Log(title = "濂楅绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(sysPackagePlanService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysUserGroupController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysUserGroupController.java
deleted file mode 100644
index abff433..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysUserGroupController.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.system.domain.bo.SysUserGroupBo;
-import org.ruoyi.system.domain.vo.SysUserGroupVo;
-import org.ruoyi.system.service.ISysUserGroupService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆�
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/userGroup")
-public class SysUserGroupController extends BaseController {
-
-    private final ISysUserGroupService sysUserGroupService;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @SaCheckPermission("system:userGroup:list")
-    @GetMapping("/list")
-    public TableDataInfo<SysUserGroupVo> list(SysUserGroupBo bo, PageQuery pageQuery) {
-        return sysUserGroupService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @SaCheckPermission("system:userGroup:export")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(SysUserGroupBo bo, HttpServletResponse response) {
-        List<SysUserGroupVo> list = sysUserGroupService.queryList(bo);
-        ExcelUtil.exportExcel(list, "銆愯濉啓鍔熻兘鍚嶇О銆�", SysUserGroupVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇銆愯濉啓鍔熻兘鍚嶇О銆戣缁嗕俊鎭�
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:userGroup:query")
-    @GetMapping("/{id}")
-    public R<SysUserGroupVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(sysUserGroupService.queryById(id));
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @SaCheckPermission("system:userGroup:add")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysUserGroupBo bo) {
-        return toAjax(sysUserGroupService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @SaCheckPermission("system:userGroup:edit")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysUserGroupBo bo) {
-        return toAjax(sysUserGroupService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:userGroup:remove")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(sysUserGroupService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysUserModelController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysUserModelController.java
deleted file mode 100644
index 3e97801..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/SysUserModelController.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import java.util.List;
-
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-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.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.system.domain.vo.SysUserModelVo;
-import org.ruoyi.system.domain.bo.SysUserModelBo;
-import org.ruoyi.system.service.ISysUserModelService;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆�
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/userModel")
-public class SysUserModelController extends BaseController {
-
-    private final ISysUserModelService sysUserModelService;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @SaCheckPermission("system:userModel:list")
-    @GetMapping("/list")
-    public TableDataInfo<SysUserModelVo> list(SysUserModelBo bo, PageQuery pageQuery) {
-        return sysUserModelService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @SaCheckPermission("system:userModel:export")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(SysUserModelBo bo, HttpServletResponse response) {
-        List<SysUserModelVo> list = sysUserModelService.queryList(bo);
-        ExcelUtil.exportExcel(list, "銆愯濉啓鍔熻兘鍚嶇О銆�", SysUserModelVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇銆愯濉啓鍔熻兘鍚嶇О銆戣缁嗕俊鎭�
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:userModel:query")
-    @GetMapping("/{id}")
-    public R<SysUserModelVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(sysUserModelService.queryById(id));
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @SaCheckPermission("system:userModel:add")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysUserModelBo bo) {
-        return toAjax(sysUserModelService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @SaCheckPermission("system:userModel:edit")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysUserModelBo bo) {
-        return toAjax(sysUserModelService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:userModel:remove")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(sysUserModelService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeChatController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeChatController.java
deleted file mode 100644
index eeaeb90..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeChatController.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//package org.ruoyi.system.controller.system;
-//
-//import cn.dev33.satoken.annotation.SaIgnore;
-//import lombok.RequiredArgsConstructor;
-//import lombok.extern.slf4j.Slf4j;
-//import org.ruoyi.common.core.exception.ServiceException;
-//import org.ruoyi.common.wechat.itchat4j.api.WechatTools;
-//import org.ruoyi.common.wechat.itchat4j.controller.LoginController;
-//import org.ruoyi.common.wechat.itchat4j.core.MsgCenter;
-//import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace;
-//import org.ruoyi.common.wechat.web.base.BaseException;
-//import org.ruoyi.system.domain.bo.WxRobConfigBo;
-//import org.ruoyi.system.domain.vo.WxRobConfigVo;
-//import org.ruoyi.system.handler.MyMsgHandler;
-//import org.ruoyi.system.service.ISseService;
-//import org.ruoyi.system.service.IWxRobConfigService;
-//import org.springframework.validation.annotation.Validated;
-//import org.springframework.web.bind.annotation.PostMapping;
-//import org.springframework.web.bind.annotation.RequestParam;
-//import org.springframework.web.bind.annotation.RestController;
-//
-//import java.util.List;
-//
-///**
-// * 涓汉寰俊鎵╁睍鎺у埗鍣�
-// *
-// * @author WangLe
-// */
-//@SaIgnore
-//@Slf4j
-//@Validated
-//@RequiredArgsConstructor
-//@RestController
-//public class WeChatController {
-//
-//    private final ISseService sseService;
-//
-//    private final IWxRobConfigService wxRobConfigService;
-//
-//    /**
-//     * 鐧诲綍绗竴姝ワ紝鑾峰彇浜岀淮鐮侀摼鎺�
-//     * @throws BaseException
-//     */
-//    @PostMapping("/getQr")
-//    public String getQr(@RequestParam String uniqueKey) {
-//        LoginController login = new LoginController(uniqueKey);
-//        try {
-//            return login.login_1();
-//        } catch (BaseException e) {
-//            throw new ServiceException("鑾峰彇浜岀淮鐮佸け璐ワ細"+ e.getMessage());
-//        }
-//    }
-//
-//    @PostMapping("/wxLogin")
-//    public Boolean wxLogin(@RequestParam String uniqueKey) {
-//        LoginController login = new LoginController(uniqueKey);
-//        return login.login_2();
-//    }
-//
-//    @PostMapping("/wxInit")
-//    public Boolean wxInit(@RequestParam String uniqueKey) {
-//        LoginController login = new LoginController(uniqueKey);
-//        // 寮�鍚秷鎭鐞嗙嚎绋�
-//        WxRobConfigBo wxRobConfigBo = new WxRobConfigBo();
-//        wxRobConfigBo.setUniqueKey(uniqueKey);
-//        List<WxRobConfigVo> wxRobConfigVos = wxRobConfigService.queryList(wxRobConfigBo);
-//        //鏌ヨ鏈哄櫒浜哄搴旂殑鐢ㄦ埛
-//        start(uniqueKey,new MyMsgHandler(uniqueKey,sseService,wxRobConfigVos.get(0)));
-//        return login.login_3();
-//    }
-//
-//    @PostMapping("/wxLogout")
-//    public void wxLogout(@RequestParam String uniqueKey) {
-//        WechatTools.logout(uniqueKey);
-//    }
-//
-//    public void start(String uniqueKey,IMsgHandlerFace msgHandler) {
-//        log.info("7.+++寮�鍚秷鎭鐞嗙嚎绋媅"+uniqueKey+"]+++");
-//        new Thread(() -> MsgCenter.handleMsg(uniqueKey,msgHandler)).start();
-//    }
-//}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeixinServerController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeixinServerController.java
deleted file mode 100644
index f0ac84f..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeixinServerController.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-
-import jakarta.servlet.http.HttpServletRequest;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.ruoyi.system.service.WeixinUserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author https://www.wdbyte.com
- */
-@Slf4j
-@RestController
-public class WeixinServerController {
-
-    @Autowired
-    private WeixinUserService weixinUserService;
-
-    @GetMapping(value = "/weixin/check")
-    public String weixinCheck(HttpServletRequest request) {
-        String signature = request.getParameter("signature");
-        String timestamp = request.getParameter("timestamp");
-        String nonce = request.getParameter("nonce");
-        String echostr = request.getParameter("echostr");
-
-        if (StringUtils.isEmpty(signature) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(nonce)) {
-            return "";
-        }
-        weixinUserService.checkSignature(signature, timestamp, nonce);
-        return echostr;
-    }
-
-    @PostMapping(value = "/weixin/check")
-    public String weixinMsg(@RequestBody String requestBody, @RequestParam("signature") String signature,
-        @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce) {
-
-        log.debug("requestBody:{}", requestBody);
-        log.debug("signature:{}", signature);
-        log.debug("timestamp:{}", timestamp);
-        log.debug("nonce:{}", nonce);
-
-        weixinUserService.checkSignature(signature, timestamp, nonce);
-        return weixinUserService.handleWeixinMsg(requestBody);
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeixinUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeixinUserController.java
deleted file mode 100644
index d006ba5..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WeixinUserController.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.system.domain.model.WeixinQrCode;
-import org.ruoyi.system.domain.vo.LoginVo;
-import org.ruoyi.system.service.SysLoginService;
-import org.ruoyi.system.util.WeixinApiUtil;
-import org.ruoyi.system.util.WeixinQrCodeCacheUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author https://www.wdbyte.com
- */
-@Slf4j
-@RestController
-public class WeixinUserController {
-
-    @Autowired
-    private WeixinApiUtil weixinApiUtil;
-
-    @Autowired
-    private SysLoginService loginService;
-
-    @GetMapping(value = "/user/qrcode")
-    public R<WeixinQrCode> getQrCode() {
-        WeixinQrCode qrCode = weixinApiUtil.getQrCode();
-        qrCode.setUrl(null);
-        qrCode.setExpireSeconds(null);
-        return R.ok(qrCode);
-    }
-
-    /**
-     * 鏍¢獙鏄惁鎵弿瀹屾垚
-     * 瀹屾垚锛岃繑鍥� JWT
-     * 鏈畬鎴愶紝杩斿洖 check faild
-     *
-     * @param ticket
-     * @return
-     */
-    @GetMapping(value = "/user/login/qrcode")
-    public R<LoginVo> userLogin(String ticket) {
-        String openId = WeixinQrCodeCacheUtil.get(ticket);
-        if (StringUtils.isNotEmpty(openId)) {
-            log.info("login success,open id:{}", openId);
-            LoginVo loginVo = loginService.mpLogin(openId);
-            return R.ok(loginVo);
-        }
-        log.info("login error,ticket:{}", ticket);
-        return R.fail("check faild");
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WxRobConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WxRobConfigController.java
deleted file mode 100644
index c534683..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WxRobConfigController.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.common.wechat.web.utils.UUIDShortUtil;
-import org.ruoyi.system.domain.bo.WxRobConfigBo;
-import org.ruoyi.system.domain.vo.WxRobConfigVo;
-import org.ruoyi.system.service.IWxRobConfigService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 鏈哄櫒浜�
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/robConfig")
-public class WxRobConfigController extends BaseController {
-
-    private final IWxRobConfigService wxRobConfigService;
-
-    /**
-     * 鏌ヨ鏈哄櫒浜哄垪琛�
-     */
-    @GetMapping("/list")
-    public TableDataInfo<WxRobConfigVo> list(WxRobConfigBo bo, PageQuery pageQuery) {
-        return wxRobConfigService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鐢ㄦ埛缁戝畾鐨勬満鍣ㄤ汉淇℃伅
-     * @param bo 鏌ヨ鍙傛暟
-     * @return 鏈哄櫒浜轰俊鎭�
-     */
-    @GetMapping("/getRobConfig")
-    public R<List<WxRobConfigVo>> botList(WxRobConfigBo bo) {
-        bo.setUserId(LoginHelper.getUserId());
-        return R.ok(wxRobConfigService.queryList(bo));
-    }
-
-    /**
-     * 瀵煎嚭鏈哄櫒浜哄垪琛�
-     */
-    @Log(title = "鏈哄櫒浜�", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(WxRobConfigBo bo, HttpServletResponse response) {
-        List<WxRobConfigVo> list = wxRobConfigService.queryList(bo);
-        ExcelUtil.exportExcel(list, "鏈哄櫒浜�", WxRobConfigVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇鏈哄櫒浜鸿缁嗕俊鎭�
-     *
-     * @param id 涓婚敭
-     */
-    @GetMapping("/{id}")
-    public R<WxRobConfigVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(wxRobConfigService.queryById(id));
-    }
-
-    /**
-     * 鏂板鏈哄櫒浜�
-     */
-    @Log(title = "鏈哄櫒浜�", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody WxRobConfigBo bo) {
-        String uniKey = UUIDShortUtil.generateShortUuid();
-        bo.setUniqueKey(uniKey);
-        return toAjax(wxRobConfigService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼鏈哄櫒浜�
-     */
-    @Log(title = "鏈哄櫒浜�", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WxRobConfigBo bo) {
-        return toAjax(wxRobConfigService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎鏈哄櫒浜�
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @Log(title = "鍒犻櫎鏈哄櫒浜�", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(wxRobConfigService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WxRobKeywordController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WxRobKeywordController.java
deleted file mode 100644
index 755c2dc..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/WxRobKeywordController.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.ruoyi.system.controller.system;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.R;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.excel.utils.ExcelUtil;
-import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
-import org.ruoyi.common.log.annotation.Log;
-import org.ruoyi.common.log.enums.BusinessType;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.web.core.BaseController;
-import org.ruoyi.system.domain.bo.WxRobKeywordBo;
-import org.ruoyi.system.domain.vo.WxRobKeywordVo;
-import org.ruoyi.system.service.IWxRobKeywordService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆�
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/robKeyword")
-public class WxRobKeywordController extends BaseController {
-
-    private final IWxRobKeywordService wxRobKeywordService;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @SaCheckPermission("system:robKeyword:list")
-    @GetMapping("/list")
-    public TableDataInfo<WxRobKeywordVo> list(WxRobKeywordBo bo, PageQuery pageQuery) {
-        return wxRobKeywordService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 瀵煎嚭銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @SaCheckPermission("system:robKeyword:export")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(WxRobKeywordBo bo, HttpServletResponse response) {
-        List<WxRobKeywordVo> list = wxRobKeywordService.queryList(bo);
-        ExcelUtil.exportExcel(list, "銆愯濉啓鍔熻兘鍚嶇О銆�", WxRobKeywordVo.class, response);
-    }
-
-    /**
-     * 鑾峰彇銆愯濉啓鍔熻兘鍚嶇О銆戣缁嗕俊鎭�
-     *
-     * @param id 涓婚敭
-     */
-    @SaCheckPermission("system:robKeyword:query")
-    @GetMapping("/{id}")
-    public R<WxRobKeywordVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                     @PathVariable Long id) {
-        return R.ok(wxRobKeywordService.queryById(id));
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @SaCheckPermission("system:robKeyword:add")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.INSERT)
-    @RepeatSubmit()
-    @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody WxRobKeywordBo bo) {
-        return toAjax(wxRobKeywordService.insertByBo(bo));
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @SaCheckPermission("system:robKeyword:edit")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WxRobKeywordBo bo) {
-        return toAjax(wxRobKeywordService.updateByBo(bo));
-    }
-
-    /**
-     * 鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     *
-     * @param ids 涓婚敭涓�
-     */
-    @SaCheckPermission("system:robKeyword:remove")
-    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                          @PathVariable Long[] ids) {
-        return toAjax(wxRobKeywordService.deleteWithValidByIds(List.of(ids), true));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/wxsingle/WxJsController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/wxsingle/WxJsController.java
deleted file mode 100644
index a6ff01f..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/wxsingle/WxJsController.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.ruoyi.system.controller.wxsingle;
-
-
-import me.chanjar.weixin.common.bean.WxJsapiSignature;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.cp.api.WxCpService;
-import org.ruoyi.system.cofing.WxCpConfiguration;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/0katekate0">Wang_Wong</a>
- */
-//@RestController
-//@RequiredArgsConstructor
-//@RequestMapping("/wx/cp/js/{corpId}/{agentId}/getJsConf")
-public class WxJsController {
-    @PostMapping("/getJsConf")
-    public Map getJsConf(
-            @PathVariable String corpId,
-            @PathVariable Integer agentId,
-            String uri) throws WxErrorException {
-
-        final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
-        if (wxCpService == null) {
-            throw new IllegalArgumentException(String.format("鏈壘鍒板搴攁gentId=[%d]鐨勯厤缃紝璇锋牳瀹烇紒", agentId));
-        }
-
-        WxJsapiSignature wxJsapiSignature = wxCpService.createJsapiSignature(uri);
-        String signature = wxJsapiSignature.getSignature();
-        String nonceStr = wxJsapiSignature.getNonceStr();
-        long timestamp = wxJsapiSignature.getTimestamp();
-
-        Map res = new HashMap<String, String>();
-        res.put("appId", corpId); // 蹇呭~锛屼紒涓氬井淇$殑corpID
-        res.put("timestamp", timestamp); // 蹇呭~锛岀敓鎴愮鍚嶇殑鏃堕棿鎴�
-        res.put("nonceStr", nonceStr); // 蹇呭~锛岀敓鎴愮鍚嶇殑闅忔満涓�
-        res.put("signature", signature); // 蹇呭~锛岀鍚嶏紝瑙� 闄勫綍-JS-SDK浣跨敤鏉冮檺绛惧悕绠楁硶
-        return res;
-    }
-
-
-    public static String genNonce() {
-        return bytesToHex(Long.toString(System.nanoTime()).getBytes(StandardCharsets.UTF_8));
-    }
-
-    public static String bytesToHex(final byte[] hash) {
-        Formatter formatter = new Formatter();
-        for (byte b : hash) {
-            formatter.format("%02x", b);
-        }
-        String result = formatter.toString();
-        formatter.close();
-        return result;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/wxsingle/WxPortalController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/wxsingle/WxPortalController.java
deleted file mode 100644
index 1ca67d1..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/wxsingle/WxPortalController.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.ruoyi.system.controller.wxsingle;
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.ruoyi.common.core.utils.JsonUtils;
-import org.ruoyi.system.cofing.WxCpConfiguration;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@RestController
-@RequestMapping("/wx/cp")
-@Slf4j
-public class WxPortalController {
-
-    @Value("${wechat.cp.appConfigs[0].agentId}")
-    private Integer agentId;
-
-
-  @GetMapping(produces = "text/plain;charset=utf-8")
-  public String authGet(
-                        @RequestParam(name = "msg_signature", required = false) String signature,
-                        @RequestParam(name = "timestamp", required = false) String timestamp,
-                        @RequestParam(name = "nonce", required = false) String nonce,
-                        @RequestParam(name = "echostr", required = false) String echostr) {
-    log.info("\n鎺ユ敹鍒版潵鑷井淇℃湇鍔″櫒鐨勮璇佹秷鎭細signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]",
-        signature, timestamp, nonce, echostr);
-
-    if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
-      throw new IllegalArgumentException("璇锋眰鍙傛暟闈炴硶锛岃鏍稿疄!");
-    }
-
-    final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
-    if (wxCpService == null) {
-      throw new IllegalArgumentException(String.format("鏈壘鍒板搴攁gentId=[%d]鐨勯厤缃紝璇锋牳瀹烇紒", agentId));
-    }
-
-    if (wxCpService.checkSignature(signature, timestamp, nonce, echostr)) {
-      return new WxCpCryptUtil(wxCpService.getWxCpConfigStorage()).decrypt(echostr);
-    }
-
-    return "闈炴硶璇锋眰";
-  }
-
-  @PostMapping(produces = "application/xml; charset=UTF-8")
-  public String post(
-                     @RequestBody String requestBody,
-                     @RequestParam("msg_signature") String signature,
-                     @RequestParam("timestamp") String timestamp,
-                     @RequestParam("nonce") String nonce) {
-    log.info("\n鎺ユ敹寰俊璇锋眰锛歔signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
-        signature, timestamp, nonce, requestBody);
-
-    final WxCpService wxCpService = WxCpConfiguration.getCpService(1000002);
-    WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(requestBody, wxCpService.getWxCpConfigStorage(),
-        timestamp, nonce, signature);
-    log.debug("\n娑堟伅瑙e瘑鍚庡唴瀹逛负锛歕n{} ", JsonUtils.toJson(inMessage));
-    WxCpXmlOutMessage outMessage = this.route(1000002, inMessage);
-    if (outMessage == null) {
-      return "";
-    }
-
-    String out = outMessage.toEncryptedXml(wxCpService.getWxCpConfigStorage());
-    log.debug("\n缁勮鍥炲淇℃伅锛歿}", out);
-    return out;
-  }
-
-  private WxCpXmlOutMessage route(Integer agentId, WxCpXmlMessage message) {
-    try {
-      return WxCpConfiguration.getRouters().get(agentId).route(message);
-    } catch (Exception e) {
-      log.error(e.getMessage(), e);
-    }
-
-    return null;
-  }
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/Cover.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/Cover.java
deleted file mode 100644
index 4ce348d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/Cover.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-
-/**
- * 缈诲敱瀵硅薄
- *
- * @author NSL
- * @date 2024-12-25
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("chat_cover")
-public class Cover extends BaseEntity {
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    @TableId(value = "id")
-    private Long id;
-    /**
-     * 姝屾洸鍚嶇О
-     */
-    private String coverMusicName;
-    /**
-     * 姝屾洸鍦板潃
-     */
-    private String coverMusicUrl;
-    /**
-     * 姝屾墜鎬у埆 鏋氫妇 FEMALE 濂虫�� MALE 鐢锋��
-     */
-    private String coverSingerGender;
-    /**
-     * 姝屾墜濮撳悕
-     */
-    private String coverSingerName;
-    /**
-     * 鐢ㄦ埛鎬у埆 FEMALE MALE
-     */
-    private String userGender;
-    /**
-     * 鐢ㄦ埛id
-     */
-    private Long userId;
-    /**
-     * 鏈娑堣垂閲戦
-     */
-    private String cost;
-    /**
-     * 缈诲敱鍚庣殑URL
-     */
-    private String coverUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/CoverPromptAudio.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/CoverPromptAudio.java
deleted file mode 100644
index b44b938..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/CoverPromptAudio.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-
-/**
- * 缈诲敱鐢ㄦ埛鍙傝�冮煶棰戝璞�
- *
- * @author NSL
- * @since  2024-12-25
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("chat_cover_prompt_audio")
-public class CoverPromptAudio extends BaseEntity {
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    @TableId(value = "id")
-    private Long id;
-    /**
-     * 缈诲敱涓昏〃id
-     */
-    private Long coverId;
-    /**
-     * 鐢ㄦ埛id
-     */
-    private Long userId;
-    /**
-     * 鍙傝�冮煶棰�
-     */
-    private String promptAudioUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateLuma.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateLuma.java
deleted file mode 100644
index 3897e86..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateLuma.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.ruoyi.system.domain;
-
-import lombok.Data;
-
-/**
- * 鎻忚堪锛氭枃鐢熻棰戣姹傚璞�
- *
- * @author ageerle@163.com
- * date 2024/6/27
- */
-@Data
-public class GenerateLuma {
-
-    private String aspect_ratio;
-
-    private boolean expand_prompt;
-
-    private String image_url;
-
-    private String user_prompt;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateLyric.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateLyric.java
deleted file mode 100644
index 9a3f67d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateLyric.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.ruoyi.system.domain;
-
-import lombok.Data;
-
-/**
- * 鎻忚堪锛氱敓鎴愭瓕璇�
- *
- * @author ageerle@163.com
- * date 2024/6/27
- */
-@Data
-public class GenerateLyric {
-
-    /**
-     * 姝岃瘝鎻愮ず璇�
-     */
-    private String prompt;
-
-    /**
-     * 鍥炶皟鍦板潃
-     */
-    private String notify_hook;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateSuno.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateSuno.java
deleted file mode 100644
index 8394010..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/GenerateSuno.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.ruoyi.system.domain;
-
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author WangLe
- */
-@Data
-public class GenerateSuno implements Serializable {
-
-    /**
-     * 姝岃瘝 (鑷畾涔夋ā寮忎笓鐢�)
-     */
-    private String prompt;
-
-    /**
-     * mv妯″瀷锛宑hirp-v3-0銆乧hirp-v3-5銆備笉鍐欓粯璁� chirp-v3-0
-     */
-    private String mv;
-
-    /**
-     * 鏍囬(鑷畾涔夋ā寮忎笓鐢�)
-     */
-    private String title;
-
-    /**
-     * 椋庢牸鏍囩(鑷畾涔夋ā寮忎笓鐢�)
-     */
-    private String tags;
-
-    /**
-     * 鏄惁鐢熸垚绾煶涔愶紝true 涓虹敓鎴愮函闊充箰
-     */
-    private boolean make_instrumental;
-
-    /**
-     * 浠诲姟id锛岀敤浜庡涔嬪墠鐨勪换鍔″啀鎿嶄綔
-     */
-    private String task_id;
-
-    /**
-     * float锛屾瓕鏇插欢闀挎椂闂达紝鍗曚綅绉�
-     */
-    private int continue_at;
-
-    /**
-     * 姝屾洸id锛岄渶瑕佺画鍐欏摢棣栨瓕
-     */
-    private String continue_clip_id;
-
-    /**
-     * 鐏垫劅妯″紡鎻愮ず璇�(鐏垫劅妯″紡涓撶敤)
-     */
-    private String gpt_description_prompt;
-
-    /**
-     * 鍥炶皟鍦板潃
-     */
-    private String notify_hook;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/PaymentOrder.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/PaymentOrder.java
deleted file mode 100644
index 6f50b36..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/PaymentOrder.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import java.math.BigDecimal;
-
-import java.io.Serial;
-
-/**
- * 鏀粯璁㈠崟瀵硅薄 payment_orders
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("chat_pay_order")
-public class PaymentOrder extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 璁㈠崟缂栧彿
-     */
-    private String orderNo;
-
-    /**
-     * 璁㈠崟鍚嶇О
-     */
-    private String orderName;
-
-    /**
-     * 閲戦
-     */
-    private BigDecimal amount;
-
-    /**
-     * 鏀粯鐘舵��
-     */
-    private String paymentStatus;
-
-    /**
-     * 鏀粯鏂瑰紡
-     */
-    private String paymentMethod;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    private Long userId;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysModel.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysModel.java
deleted file mode 100644
index 789bca2..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysModel.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-
-/**
- * 绯荤粺妯″瀷瀵硅薄 sys_model
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("chat_model")
-public class SysModel extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 妯″瀷鍒嗙被
-     */
-    @ExcelProperty(value = "妯″瀷鍒嗙被")
-    private String category;
-
-    /**
-     * 妯″瀷鍚嶇О
-     */
-    private String modelName;
-
-    /**
-     * 妯″瀷鎻忚堪
-     */
-    private String modelDescribe;
-
-    /**
-     * 妯″瀷浠锋牸
-     */
-    private double modelPrice;
-
-    /**
-     * 璁¤垂绫诲瀷
-     */
-    private String modelType;
-
-    /**
-     * 鏄惁鏄剧ず
-     */
-    private String modelShow;
-
-
-    /**
-     * 绯荤粺鎻愮ず璇�
-     */
-    private String systemPrompt;
-
-    /**
-     * 璇锋眰鍦板潃
-     */
-    private String apiHost;
-
-    /**
-     * 瀵嗛挜
-     */
-    private String apiKey;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysPackagePlan.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysPackagePlan.java
deleted file mode 100644
index 5bfbe80..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysPackagePlan.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-import java.math.BigDecimal;
-
-/**
- * 濂楅绠$悊瀵硅薄 sys_package_plan
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("chat_package_plan")
-public class SysPackagePlan extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 濂楅鍚嶇О
-     */
-    private String name;
-
-    /**
-     * 濂楅浠锋牸
-     */
-    private BigDecimal price;
-
-    /**
-     * 鏈夋晥鏃堕棿
-     */
-    private Long duration;
-
-    /**
-     * 璁″垝璇︽儏
-     */
-    private String planDetail;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUser.java
deleted file mode 100644
index 96e80db..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUser.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import org.ruoyi.common.core.constant.UserConstants;
-import org.ruoyi.common.tenant.core.TenantEntity;
-
-import java.util.Date;
-
-/**
- * 鐢ㄦ埛瀵硅薄 sys_user
- *
- * @author Lion Li
- */
-
-@Data
-@NoArgsConstructor
-@EqualsAndHashCode(callSuper = true)
-@TableName("sys_user")
-public class SysUser extends TenantEntity {
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    @TableId(value = "user_id")
-    private Long userId;
-
-    /**
-     * 閮ㄩ棬ID
-     */
-    private Long deptId;
-
-    /**
-     * 鐢ㄦ埛璐﹀彿
-     */
-    private String userName;
-
-
-    /**
-     * 鐢ㄦ埛濂楅
-     */
-    private String userPlan;
-
-    /**
-     * 鐢ㄦ埛鏄电О
-     */
-    private String nickName;
-
-    /**
-     * 鐢ㄦ埛绫诲瀷锛坰ys_user绯荤粺鐢ㄦ埛锛�
-     */
-    private String userType;
-
-    /**
-     * 鐢ㄦ埛閭
-     */
-    private String email;
-
-    /**
-     * 鎵嬫満鍙风爜
-     */
-    private String phonenumber;
-
-    /**
-     * 鐢ㄦ埛鎬у埆
-     */
-    private String sex;
-
-    /**
-     * 鐢ㄦ埛澶村儚
-     */
-    private String avatar;
-
-    /**
-     * 瀵嗙爜
-     */
-    @TableField(
-        insertStrategy = FieldStrategy.NOT_EMPTY,
-        updateStrategy = FieldStrategy.NOT_EMPTY,
-        whereStrategy = FieldStrategy.NOT_EMPTY
-    )
-    private String password;
-
-    /**
-     * 甯愬彿鐘舵�侊紙0姝e父 1鍋滅敤锛�
-     */
-    private String status;
-
-    /**
-     * 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�
-     */
-    @TableLogic
-    private String delFlag;
-
-    /**
-     * 鏈�鍚庣櫥褰旾P
-     */
-    private String loginIp;
-
-    /**
-     * 娉ㄥ唽鍩熷悕
-     */
-    private String domainName;
-
-    /**
-     * 鏈�鍚庣櫥褰曟椂闂�
-     */
-    private Date loginDate;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-    /** 鏅�氱敤鎴风殑鏍囪瘑,瀵瑰綋鍓嶅紑鍙戣�呭笎鍙峰敮涓�銆備竴涓猳penid瀵瑰簲涓�涓叕浼楀彿鎴栧皬绋嬪簭 */
-    private String openId;
-
-    /** 鐢ㄦ埛浣欓 */
-    private Double userBalance;
-
-    /** 鐢ㄦ埛绛夌骇 */
-    private String userGrade;
-
-    public SysUser(Long userId) {
-        this.userId = userId;
-    }
-
-    public boolean isSuperAdmin() {
-        return UserConstants.SUPER_ADMIN_ID.equals(this.userId);
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserGroup.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserGroup.java
deleted file mode 100644
index b75abf8..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserGroup.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import org.ruoyi.common.tenant.core.TenantEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serial;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戝璞� sys_user_group
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sys_user_group")
-public class SysUserGroup extends TenantEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 鐢ㄦ埛缁勫悕绉�
-     */
-    private String groupName;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-    /**
-     * 鐗堟湰
-     */
-    @Version
-    private Long version;
-
-    /**
-     * 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 1浠h〃鍒犻櫎锛�
-     */
-    @TableLogic
-    private String delFlag;
-
-    /**
-     * 鏇存柊IP
-     */
-    private String updateIp;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserModel.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserModel.java
deleted file mode 100644
index 751a1e6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/SysUserModel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戝璞� sys_user_model
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sys_user_model")
-public class SysUserModel extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * id
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 妯″瀷id
-     */
-    private Long mid;
-
-    /**
-     * 鐢ㄦ埛缁刬d
-     */
-    private Long gid;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobConfig.java
deleted file mode 100644
index 490a3e5..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobConfig.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serial;
-
-/**
- * 寰俊鏈哄櫒浜哄璞� wx_rob_config
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("chat_rob_config")
-public class WxRobConfig extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 鐢ㄦ埛id
-     */
-    private Long userId;
-
-    /**
-     * 鏈哄櫒浜哄悕绉�
-     */
-    private String botName;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    private String uniqueKey;
-
-    /**
-     * 澶囨敞锛堝井淇″彿锛�
-     */
-    private String remark;
-
-    /**
-     * 榛樿濂藉弸鍥炲寮�鍏�
-     */
-    private String defaultFriend;
-
-    /**
-     * 榛樿缇ゅ洖澶嶅紑鍏�
-     */
-    private String defaultGroup;
-
-
-    /**
-     * 鏈哄櫒鍚敤1绂佺敤0
-     */
-    private String enable;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobKeyword.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobKeyword.java
deleted file mode 100644
index 5a4dbe6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobKeyword.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戝璞� wx_rob_keyword
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wx_rob_keyword")
-public class WxRobKeyword extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    private String uniqueKey;
-
-    /**
-     * 鍏抽敭璇�
-     */
-    private String keyData;
-
-    /**
-     * 鍥炲鍐呭
-     */
-    private String valueData;
-
-    /**
-     * 鍥炲绫诲瀷
-     */
-    private String typeData;
-
-    /**
-     * 鐩爣鏄电О
-     */
-    private String nickName;
-
-    /**
-     * 缇�1濂藉弸0
-     */
-    private Integer toGroup;
-
-    /**
-     * 鍚敤1绂佺敤0
-     */
-    private Integer enable;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobRelation.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobRelation.java
deleted file mode 100644
index e67c40c..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/WxRobRelation.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.ruoyi.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-
-import java.io.Serial;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戝璞� wx_rob_relation
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("wx_rob_relation")
-public class WxRobRelation extends BaseEntity {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 澶栨帴鍞竴鐮�
-     */
-    private String outKey;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    private String uniqueKey;
-
-    /**
-     * 鐩爣鏄电О
-     */
-    private String nickName;
-
-    /**
-     * 缇�1濂藉弸0
-     */
-    private Integer toGroup;
-
-    /**
-     * 鍚敤1绂佺敤0
-     */
-    private Integer enable;
-
-    /**
-     * IP鐧藉悕鍗�
-     */
-    private String whiteList;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/PaymentOrdersBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/PaymentOrdersBo.java
deleted file mode 100644
index e49de79..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/PaymentOrdersBo.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.system.domain.PaymentOrder;
-
-import java.math.BigDecimal;
-
-/**
- * 鏀粯璁㈠崟涓氬姟瀵硅薄 payment_orders
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = PaymentOrder.class, reverseConvertGenerate = false)
-public class PaymentOrdersBo extends BaseEntity {
-
-    /**
-     * 涓婚敭
-     */
-    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 璁㈠崟缂栧彿
-     */
-    @NotBlank(message = "璁㈠崟缂栧彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String orderNo;
-
-    /**
-     * 璁㈠崟鍚嶇О
-     */
-    @NotBlank(message = "璁㈠崟鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String orderName;
-
-    /**
-     * 閲戦
-     */
-    @NotNull(message = "閲戦涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private BigDecimal amount;
-
-    /**
-     * 鏀粯鐘舵��
-     */
-    @NotBlank(message = "鏀粯鐘舵�佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String paymentStatus;
-
-    /**
-     * 鏀粯鏂瑰紡
-     */
-    @NotBlank(message = "鏀粯鏂瑰紡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String paymentMethod;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    @NotNull(message = "鐢ㄦ埛ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Long userId;
-
-    /**
-     * 澶囨敞
-     */
-    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String remark;
-
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysModelBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysModelBo.java
deleted file mode 100644
index 6b0a160..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysModelBo.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.system.domain.SysModel;
-
-/**
- * 绯荤粺妯″瀷涓氬姟瀵硅薄 sys_model
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = SysModel.class, reverseConvertGenerate = false)
-public class SysModelBo extends BaseEntity {
-
-    /**
-     * 涓婚敭
-     */
-    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 妯″瀷鍒嗙被
-     */
-    @ExcelProperty(value = "妯″瀷鍒嗙被")
-    private String category;
-
-    /**
-     * 妯″瀷鍚嶇О
-     */
-    @NotBlank(message = "妯″瀷鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String modelName;
-
-
-    /**
-     * 妯″瀷鎻忚堪
-     */
-    @NotBlank(message = "妯″瀷鎻忚堪涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String modelDescribe;
-
-    /**
-     * 妯″瀷浠锋牸
-     */
-    @NotNull(message = "妯″瀷浠锋牸涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private double modelPrice;
-
-    /**
-     * 璁¤垂绫诲瀷 (1 token鎵h垂; 2 娆℃暟鎵h垂 )
-     */
-    @NotBlank(message = "璁¤垂绫诲瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String modelType;
-
-    /**
-     * 妯″瀷鐘舵��  (0 鏄剧ず; 1 闅愯棌 )
-     */
-    private String modelShow;
-
-
-    /**
-     * 绯荤粺鎻愮ず璇�
-     */
-    private String systemPrompt;
-
-    /**
-     * 璇锋眰鍦板潃
-     */
-    private String apiHost;
-
-    /**
-     * 璇锋眰瀵嗛挜
-     */
-    private String apiKey;
-    /**
-     * 澶囨敞
-     */
-    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String remark;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysPackagePlanBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysPackagePlanBo.java
deleted file mode 100644
index 44f182b..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysPackagePlanBo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.system.domain.SysPackagePlan;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
-import java.math.BigDecimal;
-
-/**
- * 濂楅绠$悊涓氬姟瀵硅薄 sys_package_plan
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = SysPackagePlan.class, reverseConvertGenerate = false)
-public class SysPackagePlanBo 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 BigDecimal price;
-
-    /**
-     * 鏈夋晥鏃堕棿
-     */
-    @NotNull(message = "鏈夋晥鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Long duration;
-
-    /**
-     * 璁″垝璇︽儏
-     */
-    @NotBlank(message = "璁″垝璇︽儏涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String planDetail;
-
-    /**
-     * 澶囨敞
-     */
-    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String remark;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserGroupBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserGroupBo.java
deleted file mode 100644
index 4d77355..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserGroupBo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.system.domain.SysUserGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戜笟鍔″璞� sys_user_group
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = SysUserGroup.class, reverseConvertGenerate = false)
-public class SysUserGroupBo extends BaseEntity {
-
-    /**
-     * 涓婚敭
-     */
-    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 鐢ㄦ埛缁勫悕绉�
-     */
-    @NotBlank(message = "鐢ㄦ埛缁勫悕绉颁笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String groupName;
-
-    /**
-     * 澶囨敞
-     */
-    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String remark;
-
-    /**
-     * 鏇存柊IP
-     */
-    @NotBlank(message = "鏇存柊IP涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String updateIp;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserModelBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserModelBo.java
deleted file mode 100644
index 5c77edb..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/SysUserModelBo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.system.domain.SysUserModel;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戜笟鍔″璞� sys_user_model
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = SysUserModel.class, reverseConvertGenerate = false)
-public class SysUserModelBo extends BaseEntity {
-
-    /**
-     * id
-     */
-    @NotNull(message = "id涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 妯″瀷id
-     */
-    @NotNull(message = "妯″瀷id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Long mid;
-
-    /**
-     * 鐢ㄦ埛缁刬d
-     */
-    @NotNull(message = "鐢ㄦ埛缁刬d涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Long gid;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobConfigBo.java
deleted file mode 100644
index ea8018a..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobConfigBo.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.system.domain.WxRobConfig;
-
-/**
- * 寰俊鏈哄櫒浜轰笟鍔″璞� wx_rob_config
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = WxRobConfig.class, reverseConvertGenerate = false)
-public class WxRobConfigBo extends BaseEntity {
-
-    /**
-     * 涓婚敭
-     */
-    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 鐢ㄦ埛id
-     */
-    private Long userId;
-
-    /**
-     * 鏈哄櫒浜哄悕绉�
-     */
-    private String botName;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    private String uniqueKey;
-
-    /**
-     * 榛樿濂藉弸鍥炲寮�鍏�
-     */
-    private String defaultFriend;
-
-    /**
-     * 榛樿缇ゅ洖澶嶅紑鍏�
-     */
-    private String defaultGroup;
-
-    /**
-     * 鏈哄櫒鍚敤1绂佺敤0
-     */
-    private String enable;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobKeywordBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobKeywordBo.java
deleted file mode 100644
index 262bb8d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobKeywordBo.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.system.domain.WxRobKeyword;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戜笟鍔″璞� wx_rob_keyword
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = WxRobKeyword.class, reverseConvertGenerate = false)
-public class WxRobKeywordBo extends BaseEntity {
-
-    /**
-     *
-     */
-    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    @NotBlank(message = "鏈哄櫒鍞竴鐮佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String uniqueKey;
-
-    /**
-     * 鍏抽敭璇�
-     */
-    @NotBlank(message = "鍏抽敭璇嶄笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String keyData;
-
-    /**
-     * 鍥炲鍐呭
-     */
-    @NotBlank(message = "鍥炲鍐呭涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String valueData;
-
-    /**
-     * 鍥炲绫诲瀷
-     */
-    @NotBlank(message = "鍥炲绫诲瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String typeData;
-
-    /**
-     * 鐩爣鏄电О
-     */
-    @NotBlank(message = "鐩爣鏄电О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String nickName;
-
-    /**
-     * 缇�1濂藉弸0
-     */
-    @NotNull(message = "缇�1濂藉弸0涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Integer toGroup;
-
-    /**
-     * 鍚敤1绂佺敤0
-     */
-    @NotNull(message = "鍚敤1绂佺敤0涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Integer enable;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobRelationBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobRelationBo.java
deleted file mode 100644
index 56e9569..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/WxRobRelationBo.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.ruoyi.system.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.ruoyi.common.core.validate.AddGroup;
-import org.ruoyi.common.core.validate.EditGroup;
-import org.ruoyi.common.mybatis.core.domain.BaseEntity;
-import org.ruoyi.system.domain.WxRobRelation;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戜笟鍔″璞� wx_rob_relation
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = WxRobRelation.class, reverseConvertGenerate = false)
-public class WxRobRelationBo extends BaseEntity {
-
-    /**
-     *
-     */
-    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
-
-    /**
-     * 澶栨帴鍞竴鐮�
-     */
-    @NotBlank(message = "澶栨帴鍞竴鐮佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String outKey;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    @NotBlank(message = "鏈哄櫒鍞竴鐮佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String uniqueKey;
-
-    /**
-     * 鐩爣鏄电О
-     */
-    @NotBlank(message = "鐩爣鏄电О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String nickName;
-
-    /**
-     * 缇�1濂藉弸0
-     */
-    @NotNull(message = "缇�1濂藉弸0涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Integer toGroup;
-
-    /**
-     * 鍚敤1绂佺敤0
-     */
-    @NotNull(message = "鍚敤1绂佺敤0涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private Integer enable;
-
-    /**
-     * IP鐧藉悕鍗�
-     */
-    @NotBlank(message = "IP鐧藉悕鍗曚笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
-    private String whiteList;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/ApiResult.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/ApiResult.java
deleted file mode 100644
index 1dc6bf6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/ApiResult.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.ruoyi.system.domain.model;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * @author https://www.wdbyte.com
- */
-@Slf4j
-@Getter
-@Setter
-public class ApiResult {
-    private Integer code;
-    private String message;
-    private Object data;
-
-    public ApiResult() {
-    }
-
-    public ApiResult(Integer code, String message) {
-        this.code = code;
-        this.message = message;
-    }
-
-    public ApiResult(Integer code, String message, Object data) {
-        this.code = code;
-        this.message = message;
-        this.data = data;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/ReceiveMessage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/ReceiveMessage.java
deleted file mode 100644
index 3cd2b89..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/ReceiveMessage.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.ruoyi.system.domain.model;
-
-import lombok.Data;
-
-@Data
-public class ReceiveMessage {
-    /**
-     * 寮�鍙戣�呭井淇″彿
-     */
-    private String toUserName;
-    /**
-     * 鍙戦�佹柟璐﹀彿(涓�涓猳penid锛�
-     */
-    private String fromUserName;
-    /**
-     * 娑堟伅鍒涘缓鏃堕棿锛堟暣褰級
-     */
-    private String createTime;
-    /**
-     * 娑堟伅绫诲瀷
-     */
-    private String msgType;
-    /**
-     * 鏂囨湰娑堟伅鍐呭
-     */
-    private String content;
-    /**
-     * 娑堟伅ID 64浣�
-     */
-    String msgId;
-    /**
-     * 娑堟伅鐨勬暟鎹甀D 娑堟伅鏉ヨ嚜鏂囩珷鎵嶆湁
-     */
-    private String msgDataId;
-    /**
-     * 澶氬浘鏂囨椂绗嚑绡囨枃绔狅紝浠�1寮�濮� 娑堟伅濡傛灉鏉ヨ嚜鏂囩珷鎵嶆湁
-     */
-    private String idx;
-    /**
-     * 璁㈤槄浜嬩欢 subscribe 璁㈤槄 unsbscribe 鍙栨秷璁㈤槄
-     */
-    private String event;
-    /**
-     * 鎵爜 - ticket
-     */
-    private String ticket;
-
-    public String getReplyTextMsg(String msg) {
-        String xml = "<xml>\n"
-            + "       <ToUserName><![CDATA[" + getFromUserName() + "]]></ToUserName>\n"
-            + "       <FromUserName><![CDATA[" + getToUserName() + "]]></FromUserName>\n"
-            + "       <CreateTime>" + System.currentTimeMillis() + "</CreateTime>\n"
-            + "       <MsgType><![CDATA[text]]></MsgType>\n"
-            + "       <Content><![CDATA[" + msg + "]]></Content>\n"
-            + "     </xml>";
-        return xml;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/WeixinQrCode.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/WeixinQrCode.java
deleted file mode 100644
index 2ce6162..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/model/WeixinQrCode.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.domain.model;
-
-import lombok.Data;
-
-/**
- * @author https://www.wdbyte.com
- */
-@Data
-public class WeixinQrCode {
-
-    private String ticket;
-    private Long expireSeconds;
-    private String url;
-    private String qrCodeUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/translation/TranslationRequest.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/translation/TranslationRequest.java
deleted file mode 100644
index 04fa785..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/request/translation/TranslationRequest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.ruoyi.system.domain.request.translation;
-
-import lombok.Data;
-
-/**
- * 鎻忚堪锛氱炕璇戣姹傚璞�
- *
- * @author ageerle@163.com
- * date 2025/1/13
- */
-
-@Data
-public class TranslationRequest {
-    /**
-     * 鎻愮ず璇�
-     */
-    private String prompt;
-
-    /**
-     * 妯″瀷鍚嶇О
-     */
-    private String model;
-
-    /**
-     * 鐩爣璇█
-     */
-    private String targetLanguage;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/PaymentOrdersVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/PaymentOrdersVo.java
deleted file mode 100644
index ae4a4be..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/PaymentOrdersVo.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.system.domain.PaymentOrder;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-
-/**
- * 鏀粯璁㈠崟瑙嗗浘瀵硅薄 payment_orders
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = PaymentOrder.class)
-public class PaymentOrdersVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @ExcelProperty(value = "涓婚敭")
-    private Long id;
-
-    /**
-     * 璁㈠崟缂栧彿
-     */
-    @ExcelProperty(value = "璁㈠崟缂栧彿")
-    private String orderNo;
-
-    /**
-     * 璁㈠崟鍚嶇О
-     */
-    @ExcelProperty(value = "璁㈠崟鍚嶇О")
-    private String orderName;
-
-    /**
-     * 閲戦
-     */
-    @ExcelProperty(value = "閲戦")
-    private BigDecimal amount;
-
-    /**
-     * 鏀粯鐘舵��
-     */
-    @ExcelProperty(value = "鏀粯鐘舵��")
-    private String paymentStatus;
-
-    /**
-     * 鏀粯鏂瑰紡
-     */
-    @ExcelProperty(value = "鏀粯鏂瑰紡")
-    private String paymentMethod;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    @ExcelProperty(value = "鐢ㄦ埛ID")
-    private Long userId;
-
-    /**
-     * 鐢ㄦ埛ID
-     */
-    @ExcelProperty(value = "鐢ㄦ埛鍚嶇О")
-    private String userName;
-
-    /**
-     * 澶囨敞
-     */
-    @ExcelProperty(value = "澶囨敞")
-    private String remark;
-
-    /**
-     * 浜岀淮鐮佺綉缁滃湴鍧�
-     */
-    private String url;
-
-    /**
-     * 鍒涘缓鏃堕棿
-     */
-    private Date createTime;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysModelVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysModelVo.java
deleted file mode 100644
index 630fce0..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysModelVo.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.common.sensitive.annotation.Sensitive;
-import org.ruoyi.common.sensitive.core.SensitiveStrategy;
-import org.ruoyi.system.domain.SysModel;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-/**
- * 绯荤粺妯″瀷瑙嗗浘瀵硅薄 sys_model
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = SysModel.class)
-public class SysModelVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @ExcelProperty(value = "涓婚敭")
-    private Long id;
-
-    /**
-     * 妯″瀷鍒嗙被
-     */
-    @ExcelProperty(value = "妯″瀷鍒嗙被")
-    private String category;
-
-    /**
-     * 妯″瀷鍚嶇О
-     */
-    @ExcelProperty(value = "妯″瀷鍚嶇О")
-    private String modelName;
-
-
-    /**
-     * 妯″瀷鎻忚堪
-     */
-    @ExcelProperty(value = "妯″瀷鎻忚堪")
-    private String modelDescribe;
-
-    /**
-     * 妯″瀷浠锋牸
-     */
-    @ExcelProperty(value = "妯″瀷浠锋牸")
-    private double modelPrice;
-
-    /**
-     * 璁¤垂绫诲瀷
-     */
-    @ExcelProperty(value = "璁¤垂绫诲瀷")
-    private String modelType;
-
-    /**
-     * 鏄惁鏄剧ず
-     */
-    private String modelShow;
-
-
-    /**
-     * 绯荤粺鎻愮ず璇�
-     */
-    private String systemPrompt;
-
-    /**
-     * 璇锋眰鍦板潃
-     */
-    private String apiHost;
-
-    /**
-     * 妯″瀷鍚嶇О
-     */
-    @Sensitive(strategy = SensitiveStrategy.ID_CARD)
-    private String apiKey;
-
-    /**
-     * 澶囨敞
-     */
-    @ExcelProperty(value = "澶囨敞")
-    private String remark;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java
deleted file mode 100644
index d9c8229..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysNoticeVo.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.common.translation.annotation.Translation;
-import org.ruoyi.common.translation.constant.TransConstant;
-import org.ruoyi.system.domain.SysNotice;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-
-
-/**
- * 閫氱煡鍏憡瑙嗗浘瀵硅薄 sys_notice
- *
- * @author Michelle.Chung
- */
-@Data
-@AutoMapper(target = SysNotice.class)
-public class SysNoticeVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 鍏憡ID
-     */
-    private Long noticeId;
-
-    /**
-     * 鍏憡鏍囬
-     */
-    private String noticeTitle;
-
-    /**
-     * 鍏憡绫诲瀷锛�1閫氱煡 2鍏憡锛�
-     */
-    private String noticeType;
-
-    /**
-     * 鍏憡鍐呭
-     */
-    private String noticeContent;
-
-    /**
-     * 鍏憡鐘舵�侊紙0姝e父 1鍏抽棴锛�
-     */
-    private String status;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-    /**
-     * 鍒涘缓鑰�
-     */
-    private Long createBy;
-
-    /**
-     * 鍒涘缓浜哄悕绉�
-     */
-    @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy")
-    private String createByName;
-
-    /**
-     * 鍒涘缓鏃堕棿
-     */
-    private Date createTime;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysPackagePlanVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysPackagePlanVo.java
deleted file mode 100644
index 5ae53f6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysPackagePlanVo.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import java.math.BigDecimal;
-import org.ruoyi.system.domain.SysPackagePlan;
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-/**
- * 濂楅绠$悊瑙嗗浘瀵硅薄 sys_package_plan
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = SysPackagePlan.class)
-public class SysPackagePlanVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @ExcelProperty(value = "涓婚敭")
-    private Long id;
-
-    /**
-     * 濂楅鍚嶇О
-     */
-    @ExcelProperty(value = "濂楅鍚嶇О")
-    private String name;
-
-    /**
-     * 濂楅浠锋牸
-     */
-    @ExcelProperty(value = "濂楅浠锋牸")
-    private BigDecimal price;
-
-    /**
-     * 鏈夋晥鏃堕棿
-     */
-    @ExcelProperty(value = "鏈夋晥鏃堕棿")
-    private Long duration;
-
-    /**
-     * 璁″垝璇︽儏
-     */
-    @ExcelProperty(value = "璁″垝璇︽儏")
-    private String planDetail;
-
-    /**
-     * 澶囨敞
-     */
-    @ExcelProperty(value = "澶囨敞")
-    private String remark;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserGroupVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserGroupVo.java
deleted file mode 100644
index 5dd8dd2..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserGroupVo.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import org.ruoyi.system.domain.SysUserGroup;
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戣鍥惧璞� sys_user_group
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = SysUserGroup.class)
-public class SysUserGroupVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @ExcelProperty(value = "涓婚敭")
-    private Long id;
-
-    /**
-     * 鐢ㄦ埛缁勫悕绉�
-     */
-    @ExcelProperty(value = "鐢ㄦ埛缁勫悕绉�")
-    private String groupName;
-
-    /**
-     * 澶囨敞
-     */
-    @ExcelProperty(value = "澶囨敞")
-    private String remark;
-
-    /**
-     * 鏇存柊IP
-     */
-    @ExcelProperty(value = "鏇存柊IP")
-    private String updateIp;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java
deleted file mode 100644
index 1e95de2..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/SysUserModelVo.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.system.domain.SysUserModel;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戣鍥惧璞� sys_user_model
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = SysUserModel.class)
-public class SysUserModelVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * id
-     */
-    @ExcelProperty(value = "id")
-    private Long id;
-
-    /**
-     * 妯″瀷id
-     */
-    @ExcelProperty(value = "妯″瀷id")
-    private Long mid;
-
-    /**
-     * 鐢ㄦ埛缁刬d
-     */
-    @ExcelProperty(value = "鐢ㄦ埛缁刬d")
-    private Long gid;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobConfigVo.java
deleted file mode 100644
index a3102f4..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobConfigVo.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import org.ruoyi.common.excel.annotation.ExcelDictFormat;
-import org.ruoyi.common.excel.convert.ExcelDictConvert;
-import org.ruoyi.system.domain.WxRobConfig;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-
-/**
- * 寰俊鏈哄櫒浜鸿鍥惧璞� wx_rob_config
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = WxRobConfig.class)
-public class WxRobConfigVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 涓婚敭
-     */
-    @ExcelProperty(value = "涓婚敭")
-    private Long id;
-
-    /**
-     * 鐢ㄦ埛id
-     */
-    private Long userId;
-
-    /**
-     * 鐢ㄦ埛鍚嶇О
-     */
-    private String userName;
-
-    /**
-     * 鏈哄櫒浜哄悕绉�
-     */
-    private String botName;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    @ExcelProperty(value = "鏈哄櫒鍞竴鐮�")
-    private String uniqueKey;
-
-    /**
-     * 澶囨敞
-     */
-    @ExcelProperty(value = "澶囨敞", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "澶囨敞")
-    private String remark;
-
-    /**
-     * 榛樿濂藉弸鍥炲寮�鍏�
-     */
-    @ExcelProperty(value = "榛樿濂藉弸鍥炲寮�鍏�")
-    private String defaultFriend;
-
-    /**
-     * 榛樿缇ゅ洖澶嶅紑鍏�
-     */
-    @ExcelProperty(value = "榛樿缇ゅ洖澶嶅紑鍏�")
-    private String defaultGroup;
-
-
-    /**
-     * 鏈哄櫒鍚敤1绂佺敤0
-     */
-    @ExcelProperty(value = "鏈哄櫒鍚敤1绂佺敤0")
-    private String enable;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobKeywordVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobKeywordVo.java
deleted file mode 100644
index 58d1b42..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobKeywordVo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.system.domain.WxRobKeyword;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戣鍥惧璞� wx_rob_keyword
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = WxRobKeyword.class)
-public class WxRobKeywordVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @ExcelProperty(value = "")
-    private Long id;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    @ExcelProperty(value = "鏈哄櫒鍞竴鐮�")
-    private String uniqueKey;
-
-    /**
-     * 鍏抽敭璇�
-     */
-    @ExcelProperty(value = "鍏抽敭璇�")
-    private String keyData;
-
-    /**
-     * 鍥炲鍐呭
-     */
-    @ExcelProperty(value = "鍥炲鍐呭")
-    private String valueData;
-
-    /**
-     * 鍥炲绫诲瀷
-     */
-    @ExcelProperty(value = "鍥炲绫诲瀷")
-    private String typeData;
-
-    /**
-     * 鐩爣鏄电О
-     */
-    @ExcelProperty(value = "鐩爣鏄电О")
-    private String nickName;
-
-    /**
-     * 缇�1濂藉弸0
-     */
-    @ExcelProperty(value = "缇�1濂藉弸0")
-    private Integer toGroup;
-
-    /**
-     * 鍚敤1绂佺敤0
-     */
-    @ExcelProperty(value = "鍚敤1绂佺敤0")
-    private Integer enable;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobRelationVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobRelationVo.java
deleted file mode 100644
index c71a0e6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/WxRobRelationVo.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.ruoyi.system.domain.vo;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.system.domain.WxRobRelation;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆戣鍥惧璞� wx_rob_relation
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = WxRobRelation.class)
-public class WxRobRelationVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    /**
-     *
-     */
-    @ExcelProperty(value = "")
-    private Long id;
-
-    /**
-     * 澶栨帴鍞竴鐮�
-     */
-    @ExcelProperty(value = "澶栨帴鍞竴鐮�")
-    private String outKey;
-
-    /**
-     * 鏈哄櫒鍞竴鐮�
-     */
-    @ExcelProperty(value = "鏈哄櫒鍞竴鐮�")
-    private String uniqueKey;
-
-    /**
-     * 鐩爣鏄电О
-     */
-    @ExcelProperty(value = "鐩爣鏄电О")
-    private String nickName;
-
-    /**
-     * 缇�1濂藉弸0
-     */
-    @ExcelProperty(value = "缇�1濂藉弸0")
-    private Integer toGroup;
-
-    /**
-     * 鍚敤1绂佺敤0
-     */
-    @ExcelProperty(value = "鍚敤1绂佺敤0")
-    private Integer enable;
-
-    /**
-     * IP鐧藉悕鍗�
-     */
-    @ExcelProperty(value = "IP鐧藉悕鍗�")
-    private String whiteList;
-
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverCallbackVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverCallbackVo.java
deleted file mode 100644
index fe0cc46..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverCallbackVo.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.ruoyi.system.domain.vo.cover;
-
-import lombok.Data;
-
-/**
- * 缈诲敱鍥炶皟VO
- *
- * @author NSL
- * @since 2024-12-26
- */
-@Data
-public class CoverCallbackVo {
-    /** 鏈璇锋眰鐨勮鍗曞彿 */
-    private String orderId;
-
-    /** 鐢ㄦ埛ID */
-    private String userId;
-
-    /** 鏈娑堣垂閲戦 */
-    private String cost;
-
-    /** 缈诲敱鍚庣殑URL */
-    private String coverUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverParamVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverParamVo.java
deleted file mode 100644
index b07909e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverParamVo.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.ruoyi.system.domain.vo.cover;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 缈诲敱姝屾洸鍏ュ弬
- *
- * @author NSL
- * @since  2024-12-25
- */
-@Data
-public class CoverParamVo implements Serializable {
-
-    /**
-     * 姝屾洸鍚嶇О
-     */
-    @ExcelProperty(value = "姝屾洸鍚嶇О")
-    private String coverMusicName;
-    /**
-     * 姝屾洸鍦板潃
-     */
-    @ExcelProperty(value = "姝屾洸鍦板潃")
-    private String coverMusicUrl;
-    /**
-     * 姝屾墜鎬у埆 鏋氫妇 FEMALE 濂虫�� MALE 鐢锋��
-     */
-    @ExcelProperty(value = "姝屾墜鎬у埆")
-    private String coverSingerGender;
-    /**
-     * 姝屾墜濮撳悕
-     */
-    @ExcelProperty(value = "姝屾墜濮撳悕")
-    private String coverSingerName;
-    /**
-     * 鍙傝�冮煶棰戯細鐢ㄦ埛棣栨缈诲敱锛屽繀濉紱绗簩娆″強涔嬪悗缈诲敱锛氳嫢涓虹┖鍒欐部鐢ㄦ渶杩戜竴娆″弬鑰冮煶棰戣缁冩ā鍨嬶紝鑻ヤ笉涓虹┖鍒欎娇鐢ㄨ鍙傝�冮煶棰戣缁冩ā鍨嬨��
-     * 鍙浼�
-     */
-    @ExcelProperty(value = "鍙傝�冮煶棰�")
-    private List<String> promptAudioUrl;
-    /**
-     * 鐢ㄦ埛鎬у埆 FEMALE MALE
-     */
-    @ExcelProperty(value = "鐢ㄦ埛鎬у埆")
-    private String userGender;
-    /**
-     * 鐢ㄦ埛id
-     */
-    @ExcelProperty(value = "鐢ㄦ埛id")
-    private String userId;
-
-    /**
-     * 涓氬姟涓婚敭id
-     */
-    @ExcelProperty(value = "涓氬姟涓婚敭id")
-    private String orderId;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverPromptAudioVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverPromptAudioVo.java
deleted file mode 100644
index c6d554e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverPromptAudioVo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.ruoyi.system.domain.vo.cover;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.system.domain.Cover;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 缈诲敱鐢ㄦ埛鍙傝�冮煶棰戣鍥惧璞�
- *
- * @author NSL
- * @since  2024-12-25
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = Cover.class)
-public class CoverPromptAudioVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    @ExcelProperty(value = "id")
-    private Long id;
-    /**
-     * 鐢ㄦ埛id
-     */
-    @ExcelProperty(value = "鐢ㄦ埛id")
-    private Long userId;
-    /**
-     * 缈诲敱涓昏〃id
-     */
-    @ExcelProperty(value = "缈诲敱涓昏〃id")
-    private Long coverId;
-    /**
-     * 缈诲敱鍚庣殑URL
-     */
-    @ExcelProperty(value = "鍙傝�冮煶棰�")
-    private String promptAudioUrl;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverVo.java
deleted file mode 100644
index cffb757..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/CoverVo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.ruoyi.system.domain.vo.cover;
-
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.github.linpeilie.annotations.AutoMapper;
-import lombok.Data;
-import org.ruoyi.system.domain.Cover;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-/**
- * 缈诲敱瑙嗗浘瀵硅薄
- *
- * @author NSL
- * @date 2024-12-25
- */
-@Data
-@ExcelIgnoreUnannotated
-@AutoMapper(target = Cover.class)
-public class CoverVo implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1L;
-
-    @ExcelProperty(value = "id")
-    private Long id;
-    /**
-     * 姝屾洸鍚嶇О
-     */
-    @ExcelProperty(value = "姝屾洸鍚嶇О")
-    private String coverMusicName;
-    /**
-     * 姝屾洸鍦板潃
-     */
-    @ExcelProperty(value = "姝屾洸鍦板潃")
-    private String coverMusicUrl;
-    /**
-     * 姝屾墜鎬у埆 鏋氫妇 FEMALE 濂虫�� MALE 鐢锋��
-     */
-    @ExcelProperty(value = "姝屾墜鎬у埆")
-    private String coverSingerGender;
-    /**
-     * 姝屾墜濮撳悕
-     */
-    @ExcelProperty(value = "姝屾墜濮撳悕")
-    private String coverSingerName;
-    /**
-     * 鐢ㄦ埛鎬у埆 FEMALE MALE
-     */
-    @ExcelProperty(value = "鐢ㄦ埛鎬у埆")
-    private String userGender;
-    /**
-     * 鐢ㄦ埛id
-     */
-    @ExcelProperty(value = "鐢ㄦ埛id")
-    private Long userId;
-    /**
-     * 鏈娑堣垂閲戦
-     */
-    @ExcelProperty(value = "鏈娑堣垂閲戦")
-    private String cost;
-    /**
-     * 缈诲敱鍚庣殑URL
-     */
-    @ExcelProperty(value = "缈诲敱鍚庣殑URL")
-    private String coverUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/MusicVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/MusicVo.java
deleted file mode 100644
index 5d96094..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/cover/MusicVo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.ruoyi.system.domain.vo.cover;
-
-import lombok.Data;
-
-/**
- * @author NSL
- * @since 2024-12-25
- */
-@Data
-public class MusicVo {
-    /**
-     * 姝屾洸鍚嶇О
-     */
-    private String musicName;
-
-    /**
-     * 闊充箰鍦板潃
-     */
-    private String mp3Url;
-
-    /**
-     * 姝屾洸鍥剧墖
-     */
-    private String pic;
-
-    /**
-     * 姝屾墜鎴栦箰闃熷悕
-     */
-    private String singerName;
-
-    /**
-     * 姝屾墜鎬у埆
-     */
-    private String singerGender;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptAllQueryDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptAllQueryDto.java
deleted file mode 100644
index cda0115..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptAllQueryDto.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.ruoyi.system.domain.vo.ppt;
-
-import lombok.Data;
-
-/**
- * 鏌ヨ鎵�鏈塒PT鍒楄〃鏌ヨ鍙傛暟
- *
- * @author NSL
- * @since 2024/12/31
- */
-@Data
-public class PptAllQueryDto {
-    // 鍒嗛〉
-    private Integer page;
-    // 姣忛〉澶у皬锛堟渶澶т笉瓒呰繃100锛�
-    private Integer size;
-    // ppt id锛堥潪蹇呭~锛�
-    private String id;
-    // 绗笁鏂圭敤鎴稩D锛堥潪蹇呭~锛�
-    private String uid;
-    // 妯℃澘ID锛堥潪蹇呭~锛�
-    private String templateId;
-    // 鍒涘缓寮�濮嬫椂闂达紙闈炲繀濉級
-    private String startDate;
-    // 鍒涘缓缁撴潫鏃堕棿锛堥潪蹇呭~锛�
-    private String endDate;
-    // 鎸夋椂闂村�掑簭杩斿洖锛堥潪蹇呭~锛�
-    private boolean desc;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGenerateContentDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGenerateContentDto.java
deleted file mode 100644
index 82bc517..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGenerateContentDto.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.ruoyi.system.domain.vo.ppt;
-
-import lombok.Data;
-
-/**
- * 鐢熸垚澶х翰鍐呭鍙傛暟
- *
- * @author NSL
- * @since 2024/12/31
- */
-@Data
-public class PptGenerateContentDto {
-    // 妯℃澘ID锛堥潪蹇呭~锛�
-    private String templateId;
-
-    // 澶х翰 markdown 鏂囨湰
-    private String outlineMarkdown;
-
-    // 寮傛鐢熸垚PPT锛堣繖閲屽繀椤讳负 true 鎵嶄細娴佸紡鐢熸垚锛�
-    private boolean asyncGenPptx = false;
-
-    // 鐢ㄦ埛瑕佹眰
-    private String prompt;
-
-    // 鏂囦欢鏁版嵁url锛岃皟鐢ㄨВ鏋愭枃浠跺唴瀹规帴鍙h繑鍥�
-    private String dataUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGenerateOutlineDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGenerateOutlineDto.java
deleted file mode 100644
index bb54754..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGenerateOutlineDto.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.ruoyi.system.domain.vo.ppt;
-
-import lombok.Data;
-
-/**
- * 鐢熸垚PPT澶х翰鍙傛暟
- *
- * @author NSL
- * @since 2024/12/31
- */
-@Data
-public class PptGenerateOutlineDto {
-    // 鏄惁娴佸紡鐢熸垚锛堥粯璁ゆ祦寮忥級
-    private boolean stream = true;
-    // 绡囧箙闀垮害锛歴hort/medium/long, 榛樿 medium, 鍒嗗埆瀵瑰簲: 10-15椤�/20-30椤�/25-35椤�
-    private String length = "medium";
-    // 璇█: zh/zh-Hant/en/ja/ko/ar/de/fr/it/pt/es/ru
-    private String lang;
-    // 鐢ㄦ埛瑕佹眰锛堝皬浜�50瀛楋級
-    private String prompt;
-    // 鏂瑰紡涓�锛氶�氳繃涓婚鍒涘缓 涓婚锛堜笌dataUrl鍙悓鏃跺瓨鍦級
-    private String subject;
-    // 鏂瑰紡浜岋細閫氳繃鏂囦欢鍐呭鍒涘缓 鏂囦欢鏁版嵁url锛岄�氳繃瑙f瀽鏂囦欢鍐呭鎺ュ彛杩斿洖锛堜笌subject鍙悓鏃跺瓨鍦級
-    private String dataUrl;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGeneratePptxDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGeneratePptxDto.java
deleted file mode 100644
index 427e9d6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptGeneratePptxDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.ruoyi.system.domain.vo.ppt;
-
-import lombok.Data;
-
-/**
- * 鐢熸垚PPT鍙傛暟
- *
- * @author NSL
- * @since 2024/12/31
- */
-@Data
-public class PptGeneratePptxDto {
-    // 妯℃澘ID锛堥潪蹇呭~锛�
-    private String templateId;
-
-    // 鏄惁杩斿洖PPT鏁版嵁缁撴瀯
-    private boolean pptxProperty;
-
-    // 澶х翰鍐呭markdown
-    private String outlineContentMarkdown;
-
-    // 澶囨敞锛圥PT椤甸潰澶囨敞锛岄潪蹇呭~锛屾暟缁� ["鍐呭椤甸潰涓�澶囨敞", "鍐呭椤甸潰浜屽娉�"]锛�
-    private String notes;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptTemplateFilterDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptTemplateFilterDto.java
deleted file mode 100644
index 2c44146..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptTemplateFilterDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.ruoyi.system.domain.vo.ppt;
-
-import lombok.Data;
-
-/**
- * PPT妯℃澘绛涢�夋煡璇㈠弬鏁�
- *
- * @author NSL
- * @since 2024/12/31
- */
-@Data
-public class PptTemplateFilterDto {
-    // 妯℃澘绫诲瀷锛堝繀浼狅級锛�1绯荤粺妯℃澘銆�4鐢ㄦ埛鑷畾涔夋ā鏉�
-    private Integer type;
-
-    // 绫荤洰绛涢�� ['骞寸粓鎬荤粨', '鏁欒偛鍩硅', '鍖诲鍖荤枟', '鍟嗕笟璁″垝涔�', '浼佷笟浠嬬粛', '姣曚笟绛旇京', '钀ラ攢鎺ㄥ箍', '鏅氫細琛ㄥ桨', '涓汉绠�鍘�']
-    private String category;
-
-    // 椋庢牸绛涢�� ['鎵佸钩绠�绾�', '鍟嗗姟绉戞妧', '鏂囪壓娓呮柊', '鍗¢�氭墜缁�', '涓浗椋�', '鍒涙剰鏃跺皻', '鍒涙剰瓒e懗']
-    private String style;
-
-    // 涓婚棰滆壊绛涢�� ['#FA920A', '#589AFD', '#7664FA', '#65E5EC', '#61D328', '#F5FD59', '#E05757', '#8F5A0B', '#FFFFFF', '#000000']
-    private String themeColor;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptTemplateQueryDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptTemplateQueryDto.java
deleted file mode 100644
index c219984..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ppt/PptTemplateQueryDto.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.ruoyi.system.domain.vo.ppt;
-
-import lombok.Data;
-
-/**
- * 鍒嗛〉鏌ヨ PPT 妯℃澘鏌ヨ鍙傛暟
- *
- * @author NSL
- * @since 2024/12/31
- */
-@Data
-public class PptTemplateQueryDto {
-    // 鍒嗛〉
-    private Integer page;
-    // 姣忛〉澶у皬锛堟渶澶т笉瓒呰繃100锛�
-    private Integer size;
-    // 妯″瀷绛涢�夊弬鏁�
-    private PptTemplateFilterDto filters;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/CustomerBigDecimalSerialize.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/CustomerBigDecimalSerialize.java
deleted file mode 100644
index d6996e4..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/CustomerBigDecimalSerialize.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.ruoyi.system.handler;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.Objects;
-
-public class CustomerBigDecimalSerialize extends JsonSerializer<BigDecimal> {
-    @Override
-    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
-        if(Objects.nonNull(value)) {
-            //杩斿洖鍒板墠绔殑鏁版嵁涓烘暟瀛楃被鍨�,鍓嶇鎺ユ敹鏈夊彲鑳戒涪澶辩簿搴�
-            //gen.writeNumber(value.stripTrailingZeros());
-            //杩斿洖鍒板墠绔殑鏁版嵁涓哄瓧绗︿覆绫诲瀷
-            gen.writeString(value.stripTrailingZeros().toPlainString());
-            //鍘婚櫎0鍚庣紑,濡傛灉鎯崇粺涓�杩涜淇濈暀绮惧害锛屼篃鍙互閲囩敤绫讳技澶勭悊
-        }else {//濡傛灉涓簄ull鐨勮瘽锛屽氨鍐檔ull
-            gen.writeNull();
-        }
-    }
-}
-
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/MyMsgHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/MyMsgHandler.java
deleted file mode 100644
index 26936ed..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/MyMsgHandler.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package org.ruoyi.system.handler;
-
-import com.jfinal.kit.PropKit;
-import org.ruoyi.common.chat.domain.request.ChatRequest;
-import org.ruoyi.common.chat.entity.chat.ChatCompletion;
-import org.ruoyi.common.chat.entity.images.Item;
-import org.ruoyi.common.wechat.itchat4j.beans.BaseMsg;
-import org.ruoyi.common.wechat.itchat4j.core.CoreManage;
-import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace;
-import org.ruoyi.common.wechat.itchat4j.utils.LogInterface;
-import org.ruoyi.common.wechat.itchat4j.utils.enums.SendMsgType;
-import org.ruoyi.common.wechat.itchat4j.utils.tools.CommonTools;
-import org.ruoyi.common.wechat.web.constant.ConfigKeys;
-import org.ruoyi.common.wechat.web.model.WxRobConfig;
-import org.ruoyi.common.wechat.web.model.WxRobKeyword;
-import org.ruoyi.system.domain.vo.WxRobConfigVo;
-import org.ruoyi.system.service.ISseService;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.util.List;
-import java.util.regex.Matcher;
-
-/**
- * 娑堟伅澶勭悊瀹炵幇 榛樿鏂规
- * @author WesleyOne
- * @create 2018/12/11
- */
-public class MyMsgHandler implements IMsgHandlerFace,LogInterface {
-    private String uniqueKey;
-    private final ISseService sseService;
-    private WxRobConfigVo robConfigVo;
-
-    public MyMsgHandler(String uniqueKey,ISseService sseService,WxRobConfigVo robConfigVo){
-        this.uniqueKey = uniqueKey;
-        this.sseService = sseService;
-        this.robConfigVo = robConfigVo;
-    }
-
-    private String getDownloadPath(String fileName) {
-        String download_path = PropKit.get("download_path");
-        return download_path+ File.separator + uniqueKey +File.separator + fileName;
-    }
-
-    @Override
-    public void textMsgHandle(BaseMsg msg) {
-        String fromNickName = msg.getFromNickName();
-        String fromUserName = msg.getFromUserName();
-        boolean groupMsg = msg.isGroupMsg();
-        String text = msg.getText().trim();
-
-        if (groupMsg && text.contains("@" + fromNickName)) {
-            handleGroupMessage(fromNickName, fromUserName, text);
-        } else {
-            respondWithChatGPT(fromUserName, text);
-        }
-    }
-
-    private void handleGroupMessage(String fromNickName, String fromUserName, String text) {
-        String prompt = text.replace("@" + fromNickName + " ", "");
-        if (prompt.startsWith("鐢�")) {
-            generateAndSendImage(fromUserName, prompt.replaceFirst("鐢� ", ""));
-        } else {
-            respondWithChatGPT(fromUserName, prompt);
-        }
-    }
-
-    private void generateAndSendImage(String fromUserName, String prompt) {
-        List<Item> items = sseService.wxDall(prompt,robConfigVo.getUserId().toString());
-        WxRobKeyword robKeyword = new WxRobKeyword();
-        robKeyword.setTypeData(SendMsgType.IMG.toValue());
-        robKeyword.setValueData(items.get(0).getUrl());
-        sendDataByType(fromUserName, robKeyword);
-    }
-
-
-
-    private void respondWithChatGPT(String fromUserName, String prompt) {
-        ChatRequest chatBO = new ChatRequest();
-        //chatBO.setPrompt(prompt);
-        chatBO.setModel(ChatCompletion.Model.GPT_3_5_TURBO.getName());
-        String chat = sseService.chat(chatBO,robConfigVo.getUserId().toString());
-        WxRobKeyword robKeyword = new WxRobKeyword();
-        robKeyword.setTypeData(SendMsgType.TEXT.toValue());
-        robKeyword.setValueData(chat);
-        sendDataByType(fromUserName, robKeyword);
-    }
-
-    private boolean sendDataByType(String fromUserName, WxRobKeyword robKeyword) {
-        String data;
-        String type;
-        if (robKeyword != null){
-            data = robKeyword.getValueData();
-            type = robKeyword.getTypeData();
-            CoreManage.addSendMsg4UserName(uniqueKey,fromUserName,data,SendMsgType.fromValue(type));
-            return true;
-        }
-        return false;
-    }
-
-
-    @Override
-    public void sysMsgHandle(BaseMsg msg) {
-        String fromNickName = msg.getFromNickName();
-        String fromUserName = msg.getFromUserName();
-        boolean groupMsg = msg.isGroupMsg();
-
-        /**
-         * 缇ら噷鐨勬柊浜鸿繘缇ゆ秷鎭鐞�
-         * 浼樺厛鍙戜笓闂ㄨ繖涓兢鐨勬杩庤瘝
-         * 娌℃湁鍙戦�氱敤鐨�
-         * 娆㈣繋璇嶅唴瀹瑰疄璐ㄥ氨鏄湪鏈�鍓嶉潰鍔犱笂@鏄电О\n
-         *
-         * 娆㈣繋璇嶇殑鍏抽敭瀛�
-         * @see ConfigKeys#DEAFAULT_WELCOME
-         */
-
-        // 瑙f瀽鏂颁汉鍚嶅瓧
-        String text = msg.getContent();
-        String newNickName = "";
-        Matcher matcher = CommonTools.getMatcher("閭�璇穃"(.+?)\"鍔犲叆浜嗙兢鑱�", text);
-        if (matcher.find()){
-            newNickName = matcher.group(1);
-        }else{
-            matcher = CommonTools.getMatcher("\"(.+?)\"閫氳繃鎵弿(.+?)鍒嗕韩鐨勪簩缁寸爜鍔犲叆缇よ亰", text);
-            if (matcher.find()){
-                newNickName = matcher.group(1);
-            }
-        }
-
-        if (StringUtils.isNotEmpty(newNickName)){
-
-            WxRobConfig robConfig = WxRobConfig.dao.findFirst("SELECT * FROM wx_rob_config WHERE unique_key = ? LIMIT 1", uniqueKey);
-            if(robConfig != null && robConfig.getEnable()){
-                // 鍒ゆ柇鏄惁瑕佸洖澶�
-                boolean isOpen = false;
-                // 鍒ゆ柇鏄兢鑱婄殑璇濇槸鍚﹀厑璁稿洖澶� 鏄电О鍏抽敭瀛�
-                if (robConfig.getToGroup() && groupMsg){
-                    isOpen = true;
-                }
-                if (isOpen){
-                    WxRobKeyword robKeyword = WxRobKeyword.dao.findFirst("SELECT * FROM wx_rob_keyword WHERE unique_key = ? AND key_data = ? AND nick_name = ? AND enable = 1 AND to_group = ? ORDER BY id DESC LIMIT 1", uniqueKey, ConfigKeys.DEAFAULT_WELCOME,fromNickName,msg.isGroupMsg()?1:0);
-                    if (sendSysWelcomeMsg(fromUserName, newNickName, robKeyword)){ return;}
-                }
-
-                // 娌℃湁涓撻棬鐨勫叧閿瓧锛屽垯浣跨敤榛樿鍏抽敭瀛�
-                isOpen = false;
-                // 鍒ゆ柇鏄兢鑱婄殑璇濇槸鍚﹀厑璁稿洖澶� 鏄电О鍏抽敭瀛�
-                if (robConfig.getDefaultGroup() && groupMsg){
-                    isOpen = true;
-                }
-                if (isOpen){
-                    WxRobKeyword defaultRobKeyword = WxRobKeyword.dao.findFirst("SELECT * FROM wx_rob_keyword WHERE unique_key = ? AND key_data = ? AND nick_name = ? AND enable = 1 AND to_group = ? ORDER BY id DESC LIMIT 1", uniqueKey, ConfigKeys.DEAFAULT_WELCOME, ConfigKeys.DEAFAULT_KEYWORD,msg.isGroupMsg()?1:0);
-                    if (sendSysWelcomeMsg(fromUserName, newNickName, defaultRobKeyword)){ return;}
-                }
-            }
-        }
-
-    }
-
-    /**
-     * 鍙戦�佹杩庡唴瀹�
-     * @param fromUserName
-     * @param newNickName
-     * @param robKeyword
-     * @return
-     */
-    private boolean sendSysWelcomeMsg(String fromUserName, String newNickName, WxRobKeyword robKeyword) {
-        if (robKeyword != null){
-            if (robKeyword.getTypeData().equals(SendMsgType.TEXT.toValue())){
-                robKeyword.setValueData(String.format("@%s\n%s",newNickName,robKeyword.getValueData()));
-            }
-            if (sendDataByType(fromUserName, robKeyword)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public void picMsgHandle(BaseMsg msg) {
-//        // 杩欓噷浣跨敤鏀跺埌鍥剧墖鐨勬椂闂翠綔涓烘枃浠跺悕
-//        String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".jpg";
-//        // 淇濆瓨鍥剧墖鐨勮矾寰�
-//        String picPath = getDownloadPath(fileName);
-//        // 璋冪敤姝ゆ柟娉曟潵淇濆瓨鍥剧墖
-//        DownloadTools.getDownloadFn(msg, MsgTypeEnum.PIC.getType(), picPath, this.uniqueKey);
-//        CoreManage.addSendMsg4UserName(uniqueKey,msg.getFromUserName(),"鍥剧墖淇濆瓨鎴愬姛",SendMsgType.TEXT);
-        return;
-    }
-
-    @Override
-    public void voiceMsgHandle(BaseMsg msg) {
-//        // 杩欓噷浣跨敤鏀跺埌璇煶鐨勬椂闂翠綔涓烘枃浠跺悕
-//        String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".mp3";
-//        // 淇濆瓨璇煶鐨勮矾寰�
-//        String voicePath = getDownloadPath(fileName);
-//        // 璋冪敤姝ゆ柟娉曟潵淇濆瓨璇煶
-//        DownloadTools.getDownloadFn(msg, MsgTypeEnum.VOICE.getType(), voicePath, this.uniqueKey);
-//        CoreManage.addSendMsg4UserName(uniqueKey,msg.getFromUserName(),"澹伴煶淇濆瓨鎴愬姛",SendMsgType.TEXT);
-        return;
-    }
-
-    @Override
-    public void videoMsgHandle(BaseMsg msg) {
-//        // 杩欓噷浣跨敤鏀跺埌灏忚棰戠殑鏃堕棿浣滀负鏂囦欢鍚�
-//        String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".mp4";
-//        // 淇濆瓨灏忚棰戠殑璺緞
-//        String viedoPath = getDownloadPath(fileName);
-//        // 璋冪敤姝ゆ柟娉曟潵淇濆瓨灏忚棰�
-//        DownloadTools.getDownloadFn(msg, MsgTypeEnum.VIEDO.getType(), viedoPath,this.uniqueKey);
-//        CoreManage.addSendMsg4UserName(uniqueKey,msg.getFromUserName(),"瑙嗛淇濆瓨鎴愬姛",SendMsgType.TEXT);
-        return;
-    }
-
-    @Override
-    public void nameCardMsgHandle(BaseMsg msg) {
-        return ;
-    }
-
-    @Override
-    public void verifyAddFriendMsgHandle(BaseMsg msg) {
-        return ;
-    }
-
-    @Override
-    public void mediaMsgHandle(BaseMsg msg) {
-        return ;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/AbstractHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/AbstractHandler.java
deleted file mode 100644
index fa2ad94..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/AbstractHandler.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import me.chanjar.weixin.cp.message.WxCpMessageHandler;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-public abstract class AbstractHandler implements WxCpMessageHandler {
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/ContactChangeHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/ContactChangeHandler.java
deleted file mode 100644
index 7beb820..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/ContactChangeHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.ruoyi.common.core.utils.JsonUtils;
-import org.ruoyi.system.builder.TextBuilder;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * 閫氳褰曞彉鏇翠簨浠跺鐞嗗櫒.
- *
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Slf4j
-@Component
-public class ContactChangeHandler extends AbstractHandler {
-
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                    WxSessionManager sessionManager) {
-        String content = "鏀跺埌閫氳褰曞彉鏇翠簨浠讹紝鍐呭锛�" + JsonUtils.toJson(wxMessage);
-        log.info(content);
-
-        return new TextBuilder().build(content, wxMessage, cpService);
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/EnterAgentHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/EnterAgentHandler.java
deleted file mode 100644
index 82806aa..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/EnterAgentHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-
-import java.util.Map;
-
-/**
- * <pre>
- *
- * Created by Binary Wang on 2018/8/27.
- * </pre>
- *
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Slf4j
-public class EnterAgentHandler extends AbstractHandler {
-    private static final int TEST_AGENT = 1000002;
-
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService wxCpService, WxSessionManager sessionManager) throws WxErrorException {
-        // do something
-        return null;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/LocationHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/LocationHandler.java
deleted file mode 100644
index 4569617..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/LocationHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.ruoyi.system.builder.TextBuilder;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Slf4j
-@Component
-public class LocationHandler extends AbstractHandler {
-
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                    WxSessionManager sessionManager) {
-        if (wxMessage.getMsgType().equals(WxConsts.XmlMsgType.LOCATION)) {
-            //TODO 鎺ユ敹澶勭悊鐢ㄦ埛鍙戦�佺殑鍦扮悊浣嶇疆娑堟伅
-            try {
-                String content = "鎰熻阿鍙嶉锛屾偍鐨勭殑鍦扮悊浣嶇疆宸叉敹鍒帮紒";
-                return new TextBuilder().build(content, wxMessage, null);
-            } catch (Exception e) {
-                log.error("浣嶇疆娑堟伅鎺ユ敹澶勭悊澶辫触", e);
-                return null;
-            }
-        }
-
-        //涓婃姤鍦扮悊浣嶇疆浜嬩欢
-        log.info("\n涓婃姤鍦扮悊浣嶇疆锛岀含搴� : {}\n缁忓害 : {}\n绮惧害 : {}",
-            wxMessage.getLatitude(), wxMessage.getLongitude(), String.valueOf(wxMessage.getPrecision()));
-
-        //TODO  鍙互灏嗙敤鎴峰湴鐞嗕綅缃俊鎭繚瀛樺埌鏈湴鏁版嵁搴擄紝浠ヤ究浠ュ悗浣跨敤
-
-        return null;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/LogHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/LogHandler.java
deleted file mode 100644
index af32e16..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/LogHandler.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.ruoyi.common.core.utils.JsonUtils;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Slf4j
-@Component
-public class LogHandler extends AbstractHandler {
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                    WxSessionManager sessionManager) {
-        log.info("\n鎺ユ敹鍒拌姹傛秷鎭紝鍐呭锛歿}", JsonUtils.toJson(wxMessage));
-        return null;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/MenuHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/MenuHandler.java
deleted file mode 100644
index fe4617d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/MenuHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import me.chanjar.weixin.common.api.WxConsts.MenuButtonType;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Component
-public class MenuHandler extends AbstractHandler {
-
-  @Override
-  public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                  WxSessionManager sessionManager) {
-
-    String msg = String.format("type:%s, event:%s, key:%s",
-        wxMessage.getMsgType(), wxMessage.getEvent(),
-        wxMessage.getEventKey());
-    if (MenuButtonType.VIEW.equals(wxMessage.getEvent())) {
-      return null;
-    }
-
-    return WxCpXmlOutMessage.TEXT().content(msg)
-        .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
-        .build();
-  }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/MsgHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/MsgHandler.java
deleted file mode 100644
index b52a628..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/MsgHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.ruoyi.system.builder.TextBuilder;
-import org.ruoyi.system.service.ISseService;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Component
-@RequiredArgsConstructor
-public class MsgHandler extends AbstractHandler {
-
-//    private final ISseService sseService;
-
-
-
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                    WxSessionManager sessionManager) {
-        final String msgType = wxMessage.getMsgType();
-        if (msgType == null) {
-            // 濡傛灉msgType娌℃湁锛屽氨鑷繁鏍规嵁鍏蜂綋鎶ユ枃鍐呭鍋氬鐞�
-        }
-
-        if (!msgType.equals(WxConsts.XmlMsgType.EVENT)) {
-            //TODO 鍙互閫夋嫨灏嗘秷鎭繚瀛樺埌鏈湴
-        }
-
-        //TODO 缁勮鍥炲娑堟伅
-        String content = "";
-                //sseService.wxCpChat(wxMessage.getContent());
-
-        return new TextBuilder().build(content, wxMessage, cpService);
-
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/NullHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/NullHandler.java
deleted file mode 100644
index b755444..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/NullHandler.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Component
-public class NullHandler extends AbstractHandler {
-
-  @Override
-  public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                  WxSessionManager sessionManager) {
-    return null;
-  }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/ScanHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/ScanHandler.java
deleted file mode 100644
index 8a797a1..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/ScanHandler.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-public abstract class ScanHandler extends AbstractHandler {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/SubscribeHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/SubscribeHandler.java
deleted file mode 100644
index 6146c00..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/SubscribeHandler.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.WxCpUser;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.ruoyi.system.builder.TextBuilder;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Slf4j
-@Component
-public class SubscribeHandler extends AbstractHandler {
-
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                    WxSessionManager sessionManager) throws WxErrorException {
-
-        log.info("鏂板叧娉ㄧ敤鎴� OPENID: " + wxMessage.getFromUserName());
-
-        // 鑾峰彇寰俊鐢ㄦ埛鍩烘湰淇℃伅
-        WxCpUser userWxInfo = cpService.getUserService().getById(wxMessage.getFromUserName());
-
-        if (userWxInfo != null) {
-            // TODO 鍙互娣诲姞鍏虫敞鐢ㄦ埛鍒版湰鍦�
-        }
-
-        WxCpXmlOutMessage responseResult = null;
-        try {
-            responseResult = handleSpecial(wxMessage);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-        }
-
-        if (responseResult != null) {
-            return responseResult;
-        }
-
-        try {
-            return new TextBuilder().build("鎰熻阿鍏虫敞", wxMessage, cpService);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-        }
-
-        return null;
-    }
-
-    /**
-     * 澶勭悊鐗规畩璇锋眰锛屾瘮濡傚鏋滄槸鎵爜杩涙潵鐨勶紝鍙互鍋氱浉搴斿鐞�
-     */
-    private WxCpXmlOutMessage handleSpecial(WxCpXmlMessage wxMessage) {
-        //TODO
-        return null;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/UnsubscribeHandler.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/UnsubscribeHandler.java
deleted file mode 100644
index b89713f..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/handler/wxcp/UnsubscribeHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.ruoyi.system.handler.wxcp;
-
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.session.WxSessionManager;
-import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Slf4j
-@Component
-public class UnsubscribeHandler extends AbstractHandler {
-
-    @Override
-    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService cpService,
-                                    WxSessionManager sessionManager) {
-        String openId = wxMessage.getFromUserName();
-        log.info("鍙栨秷鍏虫敞鐢ㄦ埛 OPENID: " + openId);
-        // TODO 鍙互鏇存柊鏈湴鏁版嵁搴撲负鍙栨秷鍏虫敞鐘舵��
-        return null;
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/CustomerBigDecimalSerialize.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/CustomerBigDecimalSerialize.java
new file mode 100644
index 0000000..26beb91
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/CustomerBigDecimalSerialize.java
@@ -0,0 +1,25 @@
+package org.ruoyi.system.listener;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Objects;
+
+public class CustomerBigDecimalSerialize extends JsonSerializer<BigDecimal> {
+    @Override
+    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        if(Objects.nonNull(value)) {
+            //杩斿洖鍒板墠绔殑鏁版嵁涓烘暟瀛楃被鍨�,鍓嶇鎺ユ敹鏈夊彲鑳戒涪澶辩簿搴�
+            //gen.writeNumber(value.stripTrailingZeros());
+            //杩斿洖鍒板墠绔殑鏁版嵁涓哄瓧绗︿覆绫诲瀷
+            gen.writeString(value.stripTrailingZeros().toPlainString());
+            //鍘婚櫎0鍚庣紑,濡傛灉鎯崇粺涓�杩涜淇濈暀绮惧害锛屼篃鍙互閲囩敤绫讳技澶勭悊
+        }else {//濡傛灉涓簄ull鐨勮瘽锛屽氨鍐檔ull
+            gen.writeNull();
+        }
+    }
+}
+
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/SSEEventSourceListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/SSEEventSourceListener.java
deleted file mode 100644
index 92d767b..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/listener/SSEEventSourceListener.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package org.ruoyi.system.listener;
-
-
-import cn.hutool.core.collection.CollectionUtil;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.Response;
-import okhttp3.ResponseBody;
-import okhttp3.sse.EventSource;
-import okhttp3.sse.EventSourceListener;
-import org.ruoyi.common.chat.config.LocalCache;
-import org.ruoyi.common.chat.entity.chat.ChatCompletionResponse;
-import org.ruoyi.common.chat.utils.TikTokensUtil;
-import org.ruoyi.common.core.utils.SpringUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.system.domain.bo.SysModelBo;
-import org.ruoyi.system.domain.vo.SysModelVo;
-import org.ruoyi.system.service.ISysModelService;
-import org.jetbrains.annotations.NotNull;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 鎻忚堪锛歄penAIEventSourceListener
- *
- * @author https:www.unfbx.com
- * @date 2023-02-22
- */
-@Slf4j
-@RequiredArgsConstructor
-@Component
-public class SSEEventSourceListener extends EventSourceListener {
-
-    private ResponseBodyEmitter emitter;
-
-    private StringBuilder stringBuffer = new StringBuilder();
-
-    @Autowired(required = false)
-    public SSEEventSourceListener(ResponseBodyEmitter emitter) {
-        this.emitter = emitter;
-    }
-    private static final ISysModelService sysModelService = SpringUtils.getBean(ISysModelService.class);
-    private String modelName;
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onOpen(EventSource eventSource, Response response) {
-        log.info("OpenAI寤虹珛sse杩炴帴...");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @SneakyThrows
-    @Override
-    public void onEvent(@NotNull EventSource eventSource, String id, String type, String data) {
-        try {
-            if ("[DONE]".equals(data)) {
-                //鎴愬姛鍝嶅簲
-                emitter.complete();
-                if(StringUtils.isNotEmpty(modelName)){
-                    IChatCostService IChatCostService = SpringUtils.context().getBean(IChatCostService.class);
-                    IChatMessageService chatMessageService = SpringUtils.context().getBean(IChatMessageService.class);
-                    ChatMessageBo chatMessageBo = new ChatMessageBo();
-                    chatMessageBo.setModelName(modelName);
-                    chatMessageBo.setContent(stringBuffer.toString());
-                    Long userId = (Long)LocalCache.CACHE.get("userId");
-                    if(userId == null){
-                        return;
-                    }
-                    chatMessageBo.setUserId(userId);
-                    //鏌ヨ鎸夋鏁版墸璐圭殑妯″瀷
-                    SysModelBo sysModelBo = new SysModelBo();
-                    sysModelBo.setModelType("2");
-                    sysModelBo.setModelName(modelName);
-                    List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
-                    if (CollectionUtil.isNotEmpty(sysModelList)){
-                        chatMessageBo.setDeductCost(0d);
-                        chatMessageBo.setRemark("鎻愰棶鏃舵墸璐�");
-                        // 淇濆瓨娑堟伅璁板綍
-                        chatMessageService.insertByBo(chatMessageBo);
-                    }else{
-                        int tokens = TikTokensUtil.tokens(modelName,stringBuffer.toString());
-                        chatMessageBo.setTotalTokens(tokens);
-                        // 鎸塼oken鎵h垂骞朵笖淇濆瓨娑堟伅璁板綍
-                        IChatCostService.deductToken(chatMessageBo);
-                    }
-                }
-                return;
-            }
-            // 瑙f瀽杩斿洖鍐呭
-            ObjectMapper mapper = new ObjectMapper();
-            ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class);
-            if(completionResponse == null || CollectionUtil.isEmpty(completionResponse.getChoices())){
-                return;
-            }
-            Object content = completionResponse.getChoices().get(0).getDelta().getContent();
-            if(content == null){
-                content = completionResponse.getChoices().get(0).getDelta().getReasoningContent();
-                if(content == null) return;
-            }
-            if(StringUtils.isEmpty(modelName)){
-                modelName = completionResponse.getModel();
-            }
-            stringBuffer.append(content);
-            emitter.send(data);
-        } catch (Exception e) {
-            log.error("sse淇℃伅鎺ㄩ�佸け璐}鍐呭锛歿}",e.getMessage(),data);
-            eventSource.cancel();
-        }
-    }
-
-    @Override
-    public void onClosed(EventSource eventSource) {
-        log.info("OpenAI鍏抽棴sse杩炴帴...");
-    }
-
-    @SneakyThrows
-    @Override
-    public void onFailure(EventSource eventSource, Throwable t, Response response) {
-        if (Objects.isNull(response)) {
-            return;
-        }
-        ResponseBody body = response.body();
-        if (Objects.nonNull(body)) {
-            log.error("OpenAI  sse杩炴帴寮傚父data锛歿}锛屽紓甯革細{}", body.string(), t);
-        } else {
-            log.error("OpenAI  sse杩炴帴寮傚父data锛歿}锛屽紓甯革細{}", response, t);
-        }
-        eventSource.cancel();
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/CoverMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/CoverMapper.java
deleted file mode 100644
index 1a6f792..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/CoverMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.Cover;
-import org.ruoyi.system.domain.vo.cover.CoverVo;
-
-/**
- * 缈诲敱Mapper鎺ュ彛
- *
- * @author NSL
- * @since 2024-12-25
- */
-public interface CoverMapper extends BaseMapperPlus<Cover, CoverVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java
deleted file mode 100644
index 2bf27ec..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/CoverPromptAudioMapper.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.CoverPromptAudio;
-import org.ruoyi.system.domain.vo.cover.CoverPromptAudioVo;
-
-import java.util.List;
-
-/**
- * 缈诲敱鐢ㄦ埛鍙傝�冮煶棰慚apper鎺ュ彛
- *
- * @author NSL
- * @since 2024-12-25
- */
-public interface CoverPromptAudioMapper extends BaseMapperPlus<CoverPromptAudio, CoverPromptAudioVo> {
-
-    /**
-     * 鑾峰彇鏈�杩戜竴娆$炕鍞辫褰�
-     * @param userId 鐢ㄦ埛id
-     * @return 缈诲敱璁板綍
-     */
-    List<CoverPromptAudioVo> selectLatestVoByUserId(Long userId);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java
deleted file mode 100644
index 67e404a..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/PaymentOrdersMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.system.domain.PaymentOrder;
-import org.ruoyi.system.domain.vo.PaymentOrdersVo;
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-
-/**
- * 鏀粯璁㈠崟Mapper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-public interface PaymentOrdersMapper extends BaseMapperPlus<PaymentOrder, PaymentOrdersVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java
deleted file mode 100644
index 18a1f4d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysModelMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.system.domain.SysModel;
-import org.ruoyi.system.domain.vo.SysModelVo;
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-
-/**
- * 绯荤粺妯″瀷Mapper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-public interface SysModelMapper extends BaseMapperPlus<SysModel, SysModelVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java
deleted file mode 100644
index 492cf97..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysPackagePlanMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.SysPackagePlan;
-import org.ruoyi.system.domain.vo.SysPackagePlanVo;
-
-/**
- * 濂楅绠$悊Mapper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-public interface SysPackagePlanMapper extends BaseMapperPlus<SysPackagePlan, SysPackagePlanVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java
deleted file mode 100644
index 81410f3..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserGroupMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.SysUserGroup;
-import org.ruoyi.system.domain.vo.SysUserGroupVo;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-public interface SysUserGroupMapper extends BaseMapperPlus<SysUserGroup, SysUserGroupVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java
deleted file mode 100644
index 0817e82..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/SysUserModelMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.SysUserModel;
-import org.ruoyi.system.domain.vo.SysUserModelVo;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-public interface SysUserModelMapper extends BaseMapperPlus<SysUserModel, SysUserModelVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java
deleted file mode 100644
index 9cfc5b1..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobConfigMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.WxRobConfig;
-import org.ruoyi.system.domain.vo.WxRobConfigVo;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-public interface WxRobConfigMapper extends BaseMapperPlus<WxRobConfig, WxRobConfigVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java
deleted file mode 100644
index e76ec3e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobKeywordMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.system.domain.WxRobKeyword;
-import org.ruoyi.system.domain.vo.WxRobKeywordVo;
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-public interface WxRobKeywordMapper extends BaseMapperPlus<WxRobKeyword, WxRobKeywordVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java
deleted file mode 100644
index edd32fe..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/WxRobRelationMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.ruoyi.system.mapper;
-
-import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
-import org.ruoyi.system.domain.WxRobRelation;
-import org.ruoyi.system.domain.vo.WxRobRelationVo;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-public interface WxRobRelationMapper extends BaseMapperPlus<WxRobRelation, WxRobRelationVo> {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/RoleListDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/RoleListDto.java
deleted file mode 100644
index d6a8519..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/RoleListDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.ruoyi.system.request;
-
-import lombok.Data;
-
-/**
- * 鎻忚堪锛�
- *
- * @author ageerle@163.com
- * date 2024/4/27
- */
-@Data
-public class RoleListDto {
-
-    private String name;
-
-    private String description;
-
-    private String voicesId;
-
-    private String avatar;
-
-    private String previewAudio;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/RoleRequest.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/RoleRequest.java
deleted file mode 100644
index d77b1e9..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/RoleRequest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.ruoyi.system.request;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleRequest {
-
-    /**
-     * 瑙掕壊鍚嶇О
-     */
-    private String name;
-
-    /**
-     * 瑙掕壊榛樿椋庢牸闊抽鏍锋湰锛宐ase64 缂栫爜鐨勯煶棰戞暟鎹�
-     */
-    private String prompt;
-
-    /**
-     * 瑙掕壊鎻忚堪
-     */
-    private String description;
-
-    /**
-     * 澶村儚
-     */
-    private String avatar;
-
-    /**
-     * 涓撲笟鍏嬮殕鏍锋湰Zip鏂囦欢鐨勫垎鐗囦笂浼營D锛岃鍏堥�氳繃鍒嗙墖涓婁紶鎺ュ彛瀹屾垚鏂囦欢涓婁紶
-     */
-    private String lora;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/SimpleGenerateRequest.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/SimpleGenerateRequest.java
deleted file mode 100644
index 6a9378e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/request/SimpleGenerateRequest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.system.request;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author WangLe
- */
-@Data
-public class SimpleGenerateRequest {
-
-    /**
-     * 瑙掕壊ID
-     */
-    private String voiceId;
-
-    /**
-     * 瑕佺敓鎴愮殑鏂囨湰鍐呭
-     */
-    private String text;
-
-    /**
-     * 瑕佺敓鎴愮殑鏂囨湰鍐呭 浼樺厛绾ч珮浜巘ext
-     */
-    private List<String> texts;
-
-    /**
-     * 瑙掕壊椋庢牸 ID 锛堥粯璁や负default)
-     */
-    private String promptId = "default";
-
-    /**
-     * 瑕佷娇鐢ㄧ殑妯″瀷ID (鐩墠缁熶竴涓簉eecho-neural-voice-001)
-     */
-    private String model = "reecho-neural-voice-001";
-
-    /**
-     * 澶氭牱鎬� (0-100锛岄粯璁や负97)
-     */
-    private Integer randomness;
-
-    /**
-     * 绋冲畾鎬ц繃婊� (0-100锛岄粯璁や负100)
-     */
-    private Integer stability_boost;
-
-    /**
-     * 姒傜巼浼橀�夛紙0-100锛岄粯璁や负99锛�
-     */
-    private Integer probability_optimization;
-
-    /**
-     * 鏄惁鐩存帴杩斿洖鐢熸垚闊抽鐨凚ase64 DataURL锛岃�屼笉鏄疷rl閾炬帴锛堥粯璁や负false)
-     */
-    private Boolean origin_audio;
-
-    /**
-     * 鏄惁鍚敤娴佸紡鐢熸垚
-     */
-    private Boolean stream;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/MetadataResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/MetadataResponse.java
deleted file mode 100644
index ff09e6f..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/MetadataResponse.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.ruoyi.system.response;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author WangLe
- */
-@Data
-public class MetadataResponse {
-
-    /**
-     * 璇煶瑙掕壊澶村儚 URL
-     */
-    private String avatar;
-
-    /**
-     * 璇煶瑙掕壊鎻忚堪
-     */
-    private String description;
-
-    /**
-     * 璇煶瑙掕壊椋庢牸鍒楄〃
-     */
-    private List<PromptResponse> prompts;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/PromptResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/PromptResponse.java
deleted file mode 100644
index 000f902..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/PromptResponse.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.ruoyi.system.response;
-
-import lombok.Data;
-
-/**
- * 鎻忚堪锛氳闊宠鑹查鏍煎垪琛�
- *
- * @author ageerle@163.com
- * date 2024/4/27
- */
-@Data
-public class PromptResponse {
-
-    /**
-     * 瑙掕壊椋庢牸 ID
-     */
-    private String id;
-
-    /**
-     * 瑙掕壊椋庢牸鍚嶇О
-     */
-    private String name;
-
-    /**
-     * 瑙掕壊椋庢牸鏍锋湰闊抽 URL
-     */
-    private String promptOriginAudioStorageUrl;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/RoleDataResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/RoleDataResponse.java
deleted file mode 100644
index 1e7c67e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/RoleDataResponse.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.ruoyi.system.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleDataResponse {
-    /**
-     * 璇煶瑙掕壊 ID
-     */
-    private String id;
-
-    /**
-     * 闊宠鑹插悕绉�
-     */
-    private String name;
-
-    /**
-     * 璇煶瑙掕壊鐘舵�侊紝鍙互涓�
-     * pending锛堢灛鏃跺厠闅嗗凡瀹屾垚锛�
-     * lora-pending锛堜笓涓氬厠闅嗚缁冧腑锛�
-     * lora-success锛堜笓涓氬厠闅嗗凡瀹屾垚锛�
-     * lora-failed锛堜笓涓氬厠闅嗗け璐ワ級
-     */
-    private String status;
-    private MetadataResponse metadata;
-    private String from;
-    private String originId;
-    private String createdAt;
-    private String updatedAt;
-    private String deletedAt;
-    private String userId;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/RoleResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/RoleResponse.java
deleted file mode 100644
index 0f4ea42..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/RoleResponse.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.ruoyi.system.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleResponse {
-    /**
-     * 鐘舵�佺爜
-     */
-    private String status;
-    /**
-     * 鐘舵�佷俊鎭�
-     */
-    private String message;
-    /**
-     * 鍒涘缓鐨勮闊宠鑹茶鎯�
-     */
-    private RoleDataResponse data;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/SimpleGenerateDataResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/SimpleGenerateDataResponse.java
deleted file mode 100644
index 79d904b..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/SimpleGenerateDataResponse.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.ruoyi.system.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class SimpleGenerateDataResponse {
-
-    /**
-     * 鏈鐢熸垚鐨処D
-     */
-    private String id;
-
-    /**
-     * 鏈鐢熸垚缁撴灉鐨勯煶棰戞枃浠跺湴鍧�
-     */
-    private String audio;
-
-    /**
-     * 娴佸紡MP3绔偣
-     */
-    private String streamUrl;
-
-    /**
-     * 鏈鐢熸垚鎵�娑堣�楃殑鐐规暟
-     */
-    private Integer credit_used;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/SimpleGenerateResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/SimpleGenerateResponse.java
deleted file mode 100644
index ac4b358..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/SimpleGenerateResponse.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.ruoyi.system.response;
-
-import lombok.Data;
-
-/**
- * @author WangLe
- */
-@Data
-public class SimpleGenerateResponse {
-
-    /**
-     * 鐘舵�佺爜锛屽け璐ユ椂鍒欎负500
-     */
-    private String status;
-
-    /**
-     * 鐘舵�佹秷鎭�
-     */
-    private String message;
-
-    /**
-     * 鐢熸垚璇︽儏
-     */
-    private SimpleGenerateDataResponse data;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/ChatAppStoreVO.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/ChatAppStoreVO.java
deleted file mode 100644
index 0d22f20..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/ChatAppStoreVO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.ruoyi.system.response.rolelist;
-
-import lombok.Data;
-
-@Data
-public class ChatAppStoreVO {
-
-
-    private String name;
-
-    private String description;
-
-    private String voicesId;
-
-    private String avatar;
-
-    private String appUrl;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/ContentResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/ContentResponse.java
deleted file mode 100644
index ea7f747..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/ContentResponse.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.ruoyi.system.response.rolelist;
-
-import lombok.Data;
-
-/**
- *
- * 鎻忚堪锛氳幏鍙栧綋鍓嶇敤鎴风殑璇煶瑙掕壊鍒楄〃杩斿洖瀵硅薄
- *
- * @author ageerle@163.com
- * date 2024/4/27
- */
-import java.util.List;
-
-@Data
-public class ContentResponse {
-
-    /**
-     * 璇煶瑙掕壊 ID
-     */
-    private String id;
-
-    /**
-     * 璇煶瑙掕壊鍚嶇О
-     */
-    private String name;
-
-    /**
-     * 璇煶瑙掕壊鐘舵�侊紝鍙互涓簆ending锛堢灛鏃跺厠闅嗗凡瀹屾垚锛夈�乴ora-pending锛堜笓涓氬厠闅嗚缁冧腑锛夈�乴ora-success锛堜笓涓氬厠闅嗗凡瀹屾垚锛夈�乴ora-failed锛堜笓涓氬厠闅嗗け璐ワ級
-     */
-    private String status;
-
-
-    private Metadata metadata;
-    @Data
-    public static class Metadata {
-
-        /**
-         * 璇煶瑙掕壊澶村儚 URL
-         */
-        private String avatar;
-
-        /**
-         * 璇煶瑙掕壊鎻忚堪
-         */
-        private String description;
-
-        /**
-         * 璇煶瑙掕壊椋庢牸鍒楄〃
-         */
-        private List<prompt> prompts;
-
-        private String previewAudio;
-
-        private String promptMP3StorageUrl;
-
-        @Data
-        public static class prompt {
-            /**
-             * 瑙掕壊椋庢牸 ID
-             */
-            private String id;
-
-            /**
-             * 瑙掕壊椋庢牸鍚嶇О
-             */
-            private String name;
-
-            /**
-             * 瑙掕壊椋庢牸鏍锋湰闊抽 URL
-             */
-            private String promptOriginAudioStorageUrl;
-
-        }
-
-    }
-
-}
-
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/RoleListResponse.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/RoleListResponse.java
deleted file mode 100644
index a985781..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/response/rolelist/RoleListResponse.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.ruoyi.system.response.rolelist;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author WangLe
- */
-@Data
-public class RoleListResponse {
-    /**
-     * 鐘舵�佺爜
-     */
-    private String status;
-    /**
-     * 鐘舵�佷俊鎭�
-     */
-    private String message;
-    /**
-     * 鍒涘缓鐨勮闊宠鑹茶鎯�
-     */
-    private List<ContentResponse> data;
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java
deleted file mode 100644
index 13d9670..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/runner/SystemApplicationRunner.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.ruoyi.system.runner;
-
-import org.ruoyi.system.service.ISysOssConfigService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-/**
- * 鍒濆鍖� system 妯″潡瀵瑰簲涓氬姟鏁版嵁
- *
- * @author Lion Li
- */
-@Slf4j
-@RequiredArgsConstructor
-@Component
-public class SystemApplicationRunner implements ApplicationRunner {
-
-    private final ISysOssConfigService ossConfigService;
-
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        ossConfigService.init();
-        log.info("鍒濆鍖朞SS閰嶇疆鎴愬姛");
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ICoverPromptAudioService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ICoverPromptAudioService.java
deleted file mode 100644
index d610a68..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ICoverPromptAudioService.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.ruoyi.system.service;
-
-/**
- * 缈诲敱鐢ㄦ埛鍙傝�冮煶棰慡ervice鎺ュ彛
- *
- * @author NSL
- * @since  2024-12-25
- */
-public interface ICoverPromptAudioService {
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ICoverService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ICoverService.java
deleted file mode 100644
index f6c22bd..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ICoverService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.vo.cover.CoverCallbackVo;
-import org.ruoyi.system.domain.vo.cover.CoverParamVo;
-import org.ruoyi.system.domain.vo.cover.CoverVo;
-import org.ruoyi.system.domain.vo.cover.MusicVo;
-
-import java.util.List;
-
-/**
- * 缈诲敱Service鎺ュ彛
- *
- * @author NSL
- * @since 2024-12-25
- */
-public interface ICoverService {
-
-    /**
-     * 鏌ユ壘姝屾洸
-     *
-     * @param musicName 姝屾洸鍚嶇О
-     * @return 鍖归厤鐨勬瓕鏇蹭俊鎭泦鍚�
-     */
-    List<MusicVo> searchMusic(String musicName);
-
-    /**
-     * 缈诲敱鍥炶皟
-     *
-     * @param coverCallbackVo 鍥炶皟淇℃伅
-     */
-    void callback(CoverCallbackVo coverCallbackVo);
-
-    /**
-     * 缈诲敱姝屾洸
-     *
-     * @param coverParamVo 缈诲敱淇℃伅
-     */
-    void saveCoverTask(CoverParamVo coverParamVo);
-
-    /**
-     * 鏌ヨ鐢ㄦ埛鐨勭炕鍞辫褰�
-     *
-     * @return 缈诲敱璁板綍
-     */
-    TableDataInfo<CoverVo> searchCoverRecord(PageQuery pageQuery);
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IPaymentOrdersService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IPaymentOrdersService.java
deleted file mode 100644
index 1ac29b4..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IPaymentOrdersService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.bo.PaymentOrdersBo;
-import org.ruoyi.system.domain.request.OrderRequest;
-import org.ruoyi.system.domain.vo.PaymentOrdersVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 鏀粯璁㈠崟Service鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-public interface IPaymentOrdersService {
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟
-     */
-    PaymentOrdersVo queryById(Long id);
-
-
-    /**
-     * 鍒涘缓鏀粯璁㈠崟
-     */
-    PaymentOrdersBo createPayOrder(OrderRequest orderRequest);
-
-    /**
-     * 淇敼璁㈠崟鐘舵�佷负宸叉敮浠�
-     *
-     */
-    void updatePayOrder(OrderRequest orderRequest);
-
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟鍒楄〃
-     */
-    TableDataInfo<PaymentOrdersVo> queryPageList(PaymentOrdersBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟鍒楄〃
-     */
-    List<PaymentOrdersVo> queryList(PaymentOrdersBo bo);
-
-    /**
-     * 鏂板鏀粯璁㈠崟
-     */
-    Boolean insertByBo(PaymentOrdersBo bo);
-
-    /**
-     * 淇敼鏀粯璁㈠崟
-     */
-    Boolean updateByBo(PaymentOrdersBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゆ敮浠樿鍗曚俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IPptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IPptService.java
deleted file mode 100644
index eb284ab..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IPptService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.ruoyi.system.service;
-
-import com.alibaba.fastjson.JSONObject;
-import org.ruoyi.system.domain.vo.ppt.*;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-
-/**
- * AI_PPT Service鎺ュ彛
- *
- * @author NSL
- * @since 2024-12-30
- */
-public interface IPptService {
-    /**
-     * 鍚屾娴佸紡鐢熸垚 PPT
-     *
-     * @param title ppt 鏍囬
-     */
-    void syncStreamGeneratePpt(String title);
-
-    /**
-     * 鏌ヨ PPT 鍒楄〃
-     *
-     * @param pptQueryVo 鏌ヨ鍙傛暟
-     */
-    void selectPptList(PptAllQueryDto pptQueryVo);
-
-    /**
-     * 鍒嗛〉鏌ヨ PPT 妯℃澘
-     * @param pptQueryVo 鏌ヨ鍙傛暟
-     */
-    JSONObject getPptTemplates(PptTemplateQueryDto pptQueryVo);
-
-    /**
-     * 鐢熸垚澶х翰
-     * @param generateOutlineDto 鐢熸垚澶х翰鍙傛暟
-     */
-    SseEmitter generateOutline(PptGenerateOutlineDto generateOutlineDto);
-
-    /**
-     * 鐢熸垚澶х翰鍐呭
-     * @param generateContentDto 鐢熸垚澶х翰鍐呭鍙傛暟
-     */
-    SseEmitter generateContent(PptGenerateContentDto generateContentDto);
-
-    /**
-     * 鐢熸垚ppt
-     * @param generatePptxDto 鐢熸垚PPT鍙傛暟
-     */
-    JSONObject generatePptx(PptGeneratePptxDto generatePptxDto);
-
-    /**
-     * 鑾峰彇API Token
-     * @return 鏂囧澶歍oken
-     */
-    String getApiToken();
-
-    /**
-     * 鐢熸垚PPT鎴愬姛鍥炶皟鎺ュ彛
-     */
-    void successCallback();
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISseService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISseService.java
deleted file mode 100644
index 7230c78..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISseService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.ruoyi.system.service;
-
-
-import jakarta.servlet.http.HttpServletRequest;
-import org.ruoyi.common.chat.domain.request.ChatRequest;
-import org.ruoyi.common.chat.domain.request.Dall3Request;
-import org.ruoyi.common.chat.entity.Tts.TextToSpeech;
-import org.ruoyi.common.chat.entity.files.UploadFileResponse;
-import org.ruoyi.common.chat.entity.images.Item;
-import org.ruoyi.common.chat.entity.whisper.WhisperResponse;
-import org.ruoyi.system.domain.request.translation.TranslationRequest;
-import org.springframework.core.io.Resource;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-
-import java.util.List;
-
-/**
- * 鎻忚堪锛�
- *
- * @author https:www.unfbx.com
- * @date 2023-04-08
- */
-public interface ISseService {
-
-    /**
-     * 瀹㈡埛绔彂閫佹秷鎭埌鏈嶅姟绔�
-     * @param chatRequest
-     */
-    SseEmitter sseChat(ChatRequest chatRequest,HttpServletRequest request);
-
-    /**
-     * 璇煶杞枃瀛�
-     * @param file
-     */
-   WhisperResponse speechToTextTranscriptionsV2(MultipartFile file);
-
-    /**
-     * 鏂囧瓧杞闊�
-     */
-    ResponseEntity<Resource> textToSpeed(TextToSpeech textToSpeech);
-
-    /**
-     * 瀹㈡埛绔彂閫佹秷鎭埌鏈嶅姟绔�
-     * @param chatRequest
-     */
-    String chat(ChatRequest chatRequest,String userId);
-
-    /**
-     * 瀹㈡埛绔彂閫佹秷鎭埌鏈嶅姟绔�
-     */
-    List<Item> wxDall(String prompt,String userId);
-
-    /**
-     * 缁樼敾鎺ュ彛
-     * @param request
-     */
-    List<Item> dall3(Dall3Request request);
-
-
-    UploadFileResponse upload(MultipartFile file);
-
-    /**
-     * 鏂囨湰缈昏瘧
-     * @param
-     */
-    String translation(TranslationRequest translationRequest);
-
-    /**
-     * 璋冪敤鏈湴妯″瀷
-     * @param chatRequest
-     */
-    SseEmitter ollamaChat(ChatRequest chatRequest);
-
-    /**
-     * 浼佷笟搴旂敤鍥炲
-     * @param prompt 鎻愮ず璇�
-     * @return 鍥炲鍐呭
-     */
-    String wxCpChat(String prompt);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysModelService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysModelService.java
deleted file mode 100644
index ac5182c..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysModelService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.SysModel;
-import org.ruoyi.system.domain.bo.SysModelBo;
-import org.ruoyi.system.domain.vo.SysModelVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 绯荤粺妯″瀷Service鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-public interface ISysModelService {
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷
-     */
-    SysModelVo queryById(Long id);
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷鍒楄〃
-     */
-    TableDataInfo<SysModelVo> queryPageList(SysModelBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷鍒楄〃
-     */
-    List<SysModelVo> queryList(SysModelBo bo);
-
-    /**
-     * 鏂板绯荤粺妯″瀷
-     */
-    Boolean insertByBo(SysModelBo bo);
-
-    /**
-     * 淇敼绯荤粺妯″瀷
-     */
-    Boolean updateByBo(SysModelBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ょ郴缁熸ā鍨嬩俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-
-    /**
-     * 鏍规嵁妯″瀷鍚嶇О鏌ヨ妯″瀷
-     */
-    SysModel selectModelByName(String modelName);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPackagePlanService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPackagePlanService.java
deleted file mode 100644
index d8bb581..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysPackagePlanService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.system.domain.vo.SysPackagePlanVo;
-import org.ruoyi.system.domain.bo.SysPackagePlanBo;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 濂楅绠$悊Service鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-public interface ISysPackagePlanService {
-
-    /**
-     * 鏌ヨ濂楅绠$悊
-     */
-    SysPackagePlanVo queryById(Long id);
-
-    /**
-     * 鏌ヨ濂楅绠$悊鍒楄〃
-     */
-    TableDataInfo<SysPackagePlanVo> queryPageList(SysPackagePlanBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ濂楅绠$悊鍒楄〃
-     */
-    List<SysPackagePlanVo> queryList(SysPackagePlanBo bo);
-
-    /**
-     * 鏂板濂楅绠$悊
-     */
-    Boolean insertByBo(SysPackagePlanBo bo);
-
-    /**
-     * 淇敼濂楅绠$悊
-     */
-    Boolean updateByBo(SysPackagePlanBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゅ椁愮鐞嗕俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserGroupService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserGroupService.java
deleted file mode 100644
index b018639..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserGroupService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.bo.SysUserGroupBo;
-import org.ruoyi.system.domain.vo.SysUserGroupVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-public interface ISysUserGroupService {
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    SysUserGroupVo queryById(Long id);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    TableDataInfo<SysUserGroupVo> queryPageList(SysUserGroupBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    List<SysUserGroupVo> queryList(SysUserGroupBo bo);
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean insertByBo(SysUserGroupBo bo);
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean updateByBo(SysUserGroupBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゃ�愯濉啓鍔熻兘鍚嶇О銆戜俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserModelService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserModelService.java
deleted file mode 100644
index 45e2d40..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/ISysUserModelService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.system.domain.vo.SysUserModelVo;
-import org.ruoyi.system.domain.bo.SysUserModelBo;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-public interface ISysUserModelService {
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    SysUserModelVo queryById(Long id);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    TableDataInfo<SysUserModelVo> queryPageList(SysUserModelBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    List<SysUserModelVo> queryList(SysUserModelBo bo);
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean insertByBo(SysUserModelBo bo);
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean updateByBo(SysUserModelBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゃ�愯濉啓鍔熻兘鍚嶇О銆戜俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobConfigService.java
deleted file mode 100644
index bcfd940..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobConfigService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.bo.WxRobConfigBo;
-import org.ruoyi.system.domain.vo.WxRobConfigVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 鏈哄櫒浜篠ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-public interface IWxRobConfigService {
-
-    /**
-     * 鏌ヨ鏈哄櫒浜�
-     */
-    WxRobConfigVo queryById(Long id);
-
-    /**
-     * 鏌ヨ鏈哄櫒浜哄垪琛�
-     */
-    TableDataInfo<WxRobConfigVo> queryPageList(WxRobConfigBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ褰撳墠鐢ㄦ埛缁戝畾鐨勬満鍣ㄤ汉淇℃伅
-     */
-    List<WxRobConfigVo> queryList(WxRobConfigBo bo);
-
-    /**
-     * 鏂板鏈哄櫒浜�
-     */
-    Boolean insertByBo(WxRobConfigBo bo);
-
-    /**
-     * 淇敼鏈哄櫒浜�
-     */
-    Boolean updateByBo(WxRobConfigBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゆ満鍣ㄤ汉淇℃伅
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobKeywordService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobKeywordService.java
deleted file mode 100644
index 39bb526..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobKeywordService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.bo.WxRobKeywordBo;
-import org.ruoyi.system.domain.vo.WxRobKeywordVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-public interface IWxRobKeywordService {
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    WxRobKeywordVo queryById(Long id);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    TableDataInfo<WxRobKeywordVo> queryPageList(WxRobKeywordBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    List<WxRobKeywordVo> queryList(WxRobKeywordBo bo);
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean insertByBo(WxRobKeywordBo bo);
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean updateByBo(WxRobKeywordBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゃ�愯濉啓鍔熻兘鍚嶇О銆戜俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobRelationService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobRelationService.java
deleted file mode 100644
index 4344fbd..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IWxRobRelationService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.ruoyi.system.service;
-
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.bo.WxRobRelationBo;
-import org.ruoyi.system.domain.vo.WxRobRelationVo;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-public interface IWxRobRelationService {
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    WxRobRelationVo queryById(Long id);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    TableDataInfo<WxRobRelationVo> queryPageList(WxRobRelationBo bo, PageQuery pageQuery);
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    List<WxRobRelationVo> queryList(WxRobRelationBo bo);
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean insertByBo(WxRobRelationBo bo);
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    Boolean updateByBo(WxRobRelationBo bo);
-
-    /**
-     * 鏍¢獙骞舵壒閲忓垹闄ゃ�愯濉啓鍔熻兘鍚嶇О銆戜俊鎭�
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/SysLoginService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/SysLoginService.java
deleted file mode 100644
index 017388c..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/SysLoginService.java
+++ /dev/null
@@ -1,435 +0,0 @@
-package org.ruoyi.system.service;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.api.WxMaUserService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
-import cn.dev33.satoken.exception.NotLoginException;
-import cn.dev33.satoken.secure.BCrypt;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.ruoyi.common.core.constant.Constants;
-import org.ruoyi.common.core.constant.GlobalConstants;
-import org.ruoyi.common.core.constant.TenantConstants;
-import org.ruoyi.common.core.domain.dto.RoleDTO;
-import org.ruoyi.common.core.domain.model.LoginUser;
-import org.ruoyi.common.core.domain.model.VisitorLoginBody;
-import org.ruoyi.common.core.domain.model.VisitorLoginUser;
-import org.ruoyi.common.core.enums.*;
-import org.ruoyi.common.core.exception.user.CaptchaException;
-import org.ruoyi.common.core.exception.user.CaptchaExpireException;
-import org.ruoyi.common.core.exception.user.UserException;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.common.core.utils.*;
-import org.ruoyi.common.log.event.LogininforEvent;
-import org.ruoyi.common.redis.utils.RedisUtils;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.common.tenant.exception.TenantException;
-import org.ruoyi.common.tenant.helper.TenantHelper;
-import org.ruoyi.common.wechat.web.utils.UUIDShortUtil;
-import org.ruoyi.system.domain.SysUser;
-import org.ruoyi.system.domain.bo.SysUserBo;
-import org.ruoyi.system.domain.vo.LoginVo;
-import org.ruoyi.system.domain.vo.SysTenantVo;
-import org.ruoyi.system.domain.vo.SysUserVo;
-import org.ruoyi.system.mapper.SysUserMapper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.error.WxErrorException;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.time.Duration;
-import java.util.Date;
-import java.util.List;
-import java.util.function.Supplier;
-
-/**
- * 鐧诲綍鏍¢獙鏂规硶
- *
- * @author Lion Li
- */
-@RequiredArgsConstructor
-@Slf4j
-@Service
-public class SysLoginService {
-
-    private final SysUserMapper userMapper;
-    private final ISysPermissionService permissionService;
-    private final ISysTenantService tenantService;
-    private final WxMaService wxMaService;
-    private final ISysUserService userService;
-    private final ConfigService configService;
-    @Value("${user.password.maxRetryCount}")
-    private Integer maxRetryCount;
-
-    @Value("${user.password.lockTime}")
-    private Integer lockTime;
-
-    /**
-     * 鑾峰彇寰俊
-     * @param xcxCode 鑾峰彇xcxCode
-    */
-    public String getOpenidFromCode(String xcxCode) {
-        try {
-            WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(xcxCode);
-            return sessionInfo.getOpenid();
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-    /**
-     * 鐧诲綍楠岃瘉
-     *
-     * @param username 鐢ㄦ埛鍚�
-     * @param password 瀵嗙爜
-     * @param code     楠岃瘉鐮�
-     * @param uuid     鍞竴鏍囪瘑
-     * @return 缁撴灉
-     */
-    public String login(String tenantId, String username, String password, String code, String uuid) {
-        SysUserVo user = loadUserByUsername(tenantId, username);
-        checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
-        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
-        LoginUser loginUser = buildLoginUser(user);
-        // 鐢熸垚token
-        LoginHelper.loginByDevice(loginUser, DeviceType.PC);
-
-        recordLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-        recordLoginInfo(user.getUserId());
-        return StpUtil.getTokenValue();
-    }
-
-    public String smsLogin(String tenantId, String phonenumber, String smsCode) {
-        // 鏍¢獙绉熸埛
-        checkTenant(tenantId);
-        // 閫氳繃鎵嬫満鍙锋煡鎵剧敤鎴�
-        SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
-
-        checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
-        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
-        LoginUser loginUser = buildLoginUser(user);
-        // 鐢熸垚token
-        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
-
-        recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-        recordLoginInfo(user.getUserId());
-        return StpUtil.getTokenValue();
-    }
-
-    public String emailLogin(String tenantId, String email, String emailCode) {
-        // 鏍¢獙绉熸埛
-        checkTenant(tenantId);
-        // 閫氳繃鎵嬫満鍙锋煡鎵剧敤鎴�
-        SysUserVo user = loadUserByEmail(tenantId, email);
-
-        checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
-        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
-        LoginUser loginUser = buildLoginUser(user);
-        // 鐢熸垚token
-        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
-
-        recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-        recordLoginInfo(user.getUserId());
-        return StpUtil.getTokenValue();
-    }
-
-
-    /**
-     * 娓稿鐧诲綍
-     *
-     * @param loginBody
-     * @return String
-     * @Date 2023/5/18
-     **/
-    public void visitorLogin(VisitorLoginBody loginBody) {
-        String openid = "";
-        // PC绔父瀹㈢櫥褰�
-        if (LoginUserType.PC.getCode().equals(loginBody.getType())) {
-            openid = loginBody.getCode();
-        } else {
-            // 灏忕▼搴忓尶鍚嶇櫥褰�
-            try {
-                WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(loginBody.getCode());
-                openid = session.getOpenid();
-            } catch (WxErrorException e) {
-                log.error(e.getMessage(), e);
-            } finally {
-                // 娓呯悊ThreadLocal
-                WxMaConfigHolder.remove();
-            }
-        }
-    }
-
-    public LoginVo mpLogin(String openid) {
-        // 浣跨敤 openid 鏌ヨ缁戝畾鐢ㄦ埛 濡傛湭缁戝畾鐢ㄦ埛 鍒欐牴鎹笟鍔¤嚜琛屽鐞� 渚嬪 鍒涘缓榛樿鐢ㄦ埛
-        SysUserVo user = userService.selectUserByOpenId(openid);
-        VisitorLoginUser loginUser = new VisitorLoginUser();
-        if (ObjectUtil.isNull(user)) {
-            SysUserBo sysUser = new SysUserBo();
-            // 鏀逛负鑷
-            String name = "鐢ㄦ埛" + UUIDShortUtil.generateShortUuid();
-            ;
-            // 璁剧疆榛樿鐢ㄦ埛鍚�
-            sysUser.setUserName(name);
-            // 璁剧疆榛樿鏄电О
-            sysUser.setNickName(name);
-            // 璁剧疆榛樿瀵嗙爜
-            sysUser.setPassword(BCrypt.hashpw("123456"));
-            // 璁剧疆寰俊openId
-            sysUser.setOpenId(openid);
-            String configValue = configService.getConfigValue("mail", "amount");
-            // 璁剧疆榛樿浣欓
-            sysUser.setUserBalance(NumberUtils.toDouble(configValue, 1));
-            // 娉ㄥ唽鐢ㄦ埛,璁剧疆榛樿绉熸埛涓�0
-            SysUser registerUser = userService.registerUser(sysUser, "0");
-
-            // 鏋勫缓鐧诲綍鐢ㄦ埛淇℃伅
-            loginUser.setTenantId("0");
-            loginUser.setUserId(registerUser.getUserId());
-            loginUser.setUsername(registerUser.getUserName());
-            loginUser.setUserType(UserType.APP_USER.getUserType());
-            loginUser.setOpenid(openid);
-            loginUser.setNickName(registerUser.getNickName());
-
-        } else {
-            // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
-            loginUser.setTenantId(user.getTenantId());
-            loginUser.setUserId(user.getUserId());
-            loginUser.setUsername(user.getUserName());
-            loginUser.setUserType(user.getUserType());
-            loginUser.setNickName(user.getNickName());
-            loginUser.setAvatar(user.getWxAvatar());
-            loginUser.setOpenid(openid);
-        }
-        // 鐢熸垚token
-        LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
-        recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-        LoginVo loginVo = new LoginVo();
-        // 鐢熸垚浠ょ墝
-        loginVo.setToken(StpUtil.getTokenValue());
-        loginVo.setUserInfo(loginUser);
-        return loginVo;
-    }
-
-
-    /**
-     * 閫�鍑虹櫥褰�
-     */
-    public void logout() {
-        try {
-            LoginUser loginUser = LoginHelper.getLoginUser();
-            if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) {
-                // 瓒呯骇绠$悊鍛� 鐧诲嚭娓呴櫎鍔ㄦ�佺鎴�
-                TenantHelper.clearDynamic();
-            }
-            StpUtil.logout();
-            if (loginUser !=null) {
-                recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
-            }
-        } catch (NotLoginException ignored) {
-        }
-    }
-
-    /**
-     * 璁板綍鐧诲綍淇℃伅
-     *
-     * @param tenantId 绉熸埛ID
-     * @param username 鐢ㄦ埛鍚�
-     * @param status   鐘舵��
-     * @param message  娑堟伅鍐呭
-     */
-    private void recordLogininfor(String tenantId, String username, String status, String message) {
-        LogininforEvent logininforEvent = new LogininforEvent();
-        logininforEvent.setTenantId(tenantId);
-        logininforEvent.setUsername(username);
-        logininforEvent.setStatus(status);
-        logininforEvent.setMessage(message);
-        logininforEvent.setRequest(ServletUtils.getRequest());
-        SpringUtils.context().publishEvent(logininforEvent);
-    }
-
-    /**
-     * 鏍¢獙鐭俊楠岃瘉鐮�
-     */
-    private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
-        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
-        if (StringUtils.isBlank(code)) {
-            recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
-            throw new CaptchaExpireException();
-        }
-        return code.equals(smsCode);
-    }
-
-    /**
-     * 鏍¢獙閭楠岃瘉鐮�
-     */
-    private boolean validateEmailCode(String tenantId, String email, String emailCode) {
-        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
-        if (StringUtils.isBlank(code)) {
-            recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
-            throw new CaptchaExpireException();
-        }
-        return code.equals(emailCode);
-    }
-
-    /**
-     * 鏍¢獙楠岃瘉鐮�
-     *
-     * @param username 鐢ㄦ埛鍚�
-     * @param code     楠岃瘉鐮�
-     * @param uuid     鍞竴鏍囪瘑
-     */
-    public void validateCaptcha(String tenantId, String username, String code, String uuid) {
-        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
-        String captcha = RedisUtils.getCacheObject(verifyKey);
-        RedisUtils.deleteObject(verifyKey);
-        if (captcha == null) {
-            recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
-            throw new CaptchaExpireException();
-        }
-        if (!code.equalsIgnoreCase(captcha)) {
-            recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
-            throw new CaptchaException();
-        }
-    }
-
-    private SysUserVo loadUserByUsername(String tenantId, String username) {
-
-        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().select(SysUser::getUserName, SysUser::getStatus).eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId).eq(SysUser::getUserName, username));
-        if (ObjectUtil.isNull(user)) {
-            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
-            throw new UserException("user.not.exists", username);
-        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
-            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
-            throw new UserException("user.blocked", username);
-        }
-        if (TenantHelper.isEnable()) {
-            return userMapper.selectTenantUserByUserName(username, tenantId);
-        }
-        return userMapper.selectUserByUserName(username);
-    }
-
-    private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
-        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().select(SysUser::getPhonenumber, SysUser::getStatus).eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId).eq(SysUser::getPhonenumber, phonenumber));
-        if (ObjectUtil.isNull(user)) {
-            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", phonenumber);
-            throw new UserException("user.not.exists", phonenumber);
-        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
-            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", phonenumber);
-            throw new UserException("user.blocked", phonenumber);
-        }
-        if (TenantHelper.isEnable()) {
-            return userMapper.selectTenantUserByPhonenumber(phonenumber, tenantId);
-        }
-        return userMapper.selectUserByPhonenumber(phonenumber);
-    }
-
-    private SysUserVo loadUserByEmail(String tenantId, String email) {
-        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().select(SysUser::getPhonenumber, SysUser::getStatus).eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId).eq(SysUser::getEmail, email));
-        if (ObjectUtil.isNull(user)) {
-            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", email);
-            throw new UserException("user.not.exists", email);
-        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
-            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", email);
-            throw new UserException("user.blocked", email);
-        }
-        if (TenantHelper.isEnable()) {
-            return userMapper.selectTenantUserByEmail(email, tenantId);
-        }
-        return userMapper.selectUserByEmail(email);
-    }
-
-    /**
-     * 鏋勫缓鐧诲綍鐢ㄦ埛
-     */
-    private LoginUser buildLoginUser(SysUserVo user) {
-        LoginUser loginUser = new LoginUser();
-        loginUser.setTenantId(user.getTenantId());
-        loginUser.setUserId(user.getUserId());
-        loginUser.setDeptId(user.getDeptId());
-        loginUser.setUsername(user.getUserName());
-        loginUser.setAvatar(user.getAvatar());
-        loginUser.setUserType(user.getUserType());
-        loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
-        loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
-        loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
-        List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
-        loginUser.setRoles(roles);
-        return loginUser;
-    }
-
-    /**
-     * 璁板綍鐧诲綍淇℃伅
-     *
-     * @param userId 鐢ㄦ埛ID
-     */
-    public void recordLoginInfo(Long userId) {
-        SysUser sysUser = new SysUser();
-        sysUser.setUserId(userId);
-        sysUser.setLoginIp(ServletUtils.getClientIP());
-        sysUser.setLoginDate(DateUtils.getNowDate());
-        sysUser.setUpdateBy(userId);
-        userMapper.updateById(sysUser);
-    }
-
-    /**
-     * 鐧诲綍鏍¢獙
-     */
-    private void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
-        String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
-        String loginFail = Constants.LOGIN_FAIL;
-
-        // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟(鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip)
-        Integer errorNumber = RedisUtils.getCacheObject(errorKey);
-        // 閿佸畾鏃堕棿鍐呯櫥褰� 鍒欒涪鍑�
-        if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
-            recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
-            throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
-        }
-
-        if (supplier.get()) {
-            // 鏄惁绗竴娆�
-            errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
-            // 杈惧埌瑙勫畾閿欒娆℃暟 鍒欓攣瀹氱櫥褰�
-            if (errorNumber.equals(maxRetryCount)) {
-                RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
-                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
-                throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
-            } else {
-                // 鏈揪鍒拌瀹氶敊璇鏁� 鍒欓�掑
-                RedisUtils.setCacheObject(errorKey, errorNumber);
-                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
-                throw new UserException(loginType.getRetryLimitCount(), errorNumber);
-            }
-        }
-
-        // 鐧诲綍鎴愬姛 娓呯┖閿欒娆℃暟
-        RedisUtils.deleteObject(errorKey);
-    }
-
-    private void checkTenant(String tenantId) {
-        if (!TenantHelper.isEnable()) {
-            return;
-        }
-        if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
-            return;
-        }
-        SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
-        if (ObjectUtil.isNull(tenant)) {
-            log.info("鐧诲綍绉熸埛锛歿} 涓嶅瓨鍦�.", tenantId);
-            throw new TenantException("tenant.not.exists");
-        } else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) {
-            log.info("鐧诲綍绉熸埛锛歿} 宸茶鍋滅敤.", tenantId);
-            throw new TenantException("tenant.blocked");
-        } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) && new Date().after(tenant.getExpireTime())) {
-            log.info("鐧诲綍绉熸埛锛歿} 宸茶秴杩囨湁鏁堟湡.", tenantId);
-            throw new TenantException("tenant.expired");
-        }
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/WeixinUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/WeixinUserService.java
deleted file mode 100644
index 6cf778c..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/WeixinUserService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.ruoyi.system.service;
-
-/**
- * @Author 鍏紬鍙凤細绋嬪簭鐚块樋鏈�
- */
-public interface WeixinUserService {
-
-    void checkSignature(String signature, String timestamp, String nonce);
-
-    String handleWeixinMsg(String body);
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/CoverPromptAudioServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/CoverPromptAudioServiceImpl.java
deleted file mode 100644
index 51200fc..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/CoverPromptAudioServiceImpl.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.ruoyi.system.mapper.CoverPromptAudioMapper;
-import org.ruoyi.system.service.ICoverPromptAudioService;
-import org.springframework.stereotype.Service;
-
-/**
- * 缈诲敱鐢ㄦ埛鍙傝�冮煶棰慡ervice涓氬姟灞傚鐞�
- *
- * @author NSL
- * @since 2024-12-25
- */
-@Service
-@Slf4j
-public class CoverPromptAudioServiceImpl implements ICoverPromptAudioService {
-
-    @Resource
-    private CoverPromptAudioMapper coverPromptAudioMapper;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/CoverServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/CoverServiceImpl.java
deleted file mode 100644
index 4b6d96e..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/CoverServiceImpl.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import cn.dev33.satoken.exception.NotLoginException;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.TypeReference;
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.Request;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.ruoyi.common.core.exception.base.BaseException;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.wechat.itchat4j.utils.enums.ResultEnum;
-import org.ruoyi.system.cofing.OkHttpConfig;
-import org.ruoyi.system.domain.Cover;
-import org.ruoyi.system.domain.CoverPromptAudio;
-import org.ruoyi.system.domain.model.ApiResult;
-import org.ruoyi.system.domain.vo.cover.*;
-import org.ruoyi.system.mapper.CoverMapper;
-import org.ruoyi.system.mapper.CoverPromptAudioMapper;
-import org.ruoyi.system.service.ICoverService;
-import org.ruoyi.system.util.WeChatScanHttpUtil;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.ruoyi.common.satoken.utils.LoginHelper.getLoginUser;
-
-/**
- * 缈诲敱Service涓氬姟灞傚鐞�
- *
- * @author NSL
- * @since 2024-12-25
- */
-@RequiredArgsConstructor
-@Service
-@Slf4j
-public class CoverServiceImpl implements ICoverService {
-
-    private final CoverMapper coverMapper;
-    private final CoverPromptAudioMapper coverPromptAudioMapper;
-    private final ConfigService configService;
-    private final IChatCostService chatCostService;
-    private final WeChatScanHttpUtil weChatScanHttpUtil;
-    private final OkHttpConfig okHttpConfig;
-
-    @Override
-    public List<MusicVo> searchMusic(String musicName) {
-        Map<String, String> queryMap = new HashMap<>();
-        queryMap.put("keyword", musicName);
-        String json = JSONUtil.toJsonStr(queryMap);
-        Request postRequest = weChatScanHttpUtil.createPostRequest(getKey("search_music_url"), json);
-        String body = weChatScanHttpUtil.executeRequest(postRequest);
-        ApiResult apiResult = JSONUtil.toBean(body, ApiResult.class);
-        Object data = apiResult.getData();
-        Map<String, List<MusicVo>> userMap = JSONUtil.toBean(JSONUtil.toJsonStr(data), new TypeReference<>() {}, true);
-        return userMap.get("musicList");
-    }
-
-    @Override
-    public void callback(CoverCallbackVo coverCallbackVo) {
-        Cover cover = BeanUtil.copyProperties(coverCallbackVo, Cover.class);
-        coverMapper.insertOrUpdate(cover);
-    }
-
-    @Override
-    public void saveCoverTask(CoverParamVo coverParamVo) {
-        Long userId = null;
-        try {
-            userId = getLoginUser().getUserId();
-        } catch (Exception e) {
-            throw new NotLoginException(NotLoginException.NOT_TOKEN_MESSAGE, NotLoginException.NOT_TOKEN, NotLoginException.NOT_TOKEN);
-        }
-        List<String> promptAudioUrl = coverParamVo.getPromptAudioUrl();
-        Cover cover = BeanUtil.copyProperties(coverParamVo, Cover.class);
-        cover.setUserId(userId);
-        coverMapper.insertOrUpdate(cover);
-        if (CollUtil.isEmpty(promptAudioUrl)) {
-            // 鏌ヨ鐢ㄦ埛鏈�杩戜竴娆$炕鍞辫褰�
-            List<CoverPromptAudioVo> coverPromptAudioVoList = coverPromptAudioMapper.selectLatestVoByUserId(userId);
-            if (CollUtil.isEmpty(coverPromptAudioVoList)) {
-                throw new BaseException("鏈煡璇㈠埌缈诲敱璁板綍锛岃涓婁紶鍙傝�冮煶棰戯紒");
-            }
-                List<String> promptAudioUrlList = coverPromptAudioVoList.stream().map(CoverPromptAudioVo::getPromptAudioUrl).collect(Collectors.toList());
-            coverParamVo.setPromptAudioUrl(promptAudioUrlList);
-        } else {
-            // 淇濆瓨鐢ㄦ埛缈诲敱璁板綍
-            for (String audioUrl : promptAudioUrl) {
-                CoverPromptAudio coverPromptAudio = new CoverPromptAudio();
-                coverPromptAudio.setPromptAudioUrl(audioUrl);
-                coverPromptAudio.setUserId(userId);
-                coverPromptAudio.setCoverId(cover.getId());
-                coverPromptAudioMapper.insertOrUpdate(coverPromptAudio);
-            }
-        }
-        coverParamVo.setUserId(String.valueOf(userId));
-        coverParamVo.setOrderId(String.valueOf(cover.getId()));
-        coverParamVo.setUserGender("");
-        log.info("鍙戣捣缈诲敱浠诲姟,鍏ュ弬{}", JSONUtil.toJsonStr(coverParamVo));
-        // 璋冪敤缈诲敱API
-        Request postRequest = weChatScanHttpUtil.createPostRequest(getKey("cover_url"), JSONUtil.toJsonStr(coverParamVo));
-        String body = weChatScanHttpUtil.executeRequest(postRequest);
-        ApiResult apiResult = JSONUtil.toBean(body, ApiResult.class);
-        if (ResultEnum.SUCCESS.getCode().equals(String.valueOf(apiResult.getCode()))) {
-            // 鎵h垂
-            chatCostService.taskDeduct("cover", "token", NumberUtils.toDouble(okHttpConfig.getGenerate(), 2.5));
-        }
-        log.info("璋冪敤缈诲敱缁撴灉,鍑哄弬{}", body);
-    }
-
-    @Override
-    public TableDataInfo<CoverVo> searchCoverRecord(PageQuery pageQuery) {
-        LambdaQueryWrapper<Cover> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(Cover::getUserId, getLoginUser().getUserId());
-        queryWrapper.orderByDesc(Cover::getCreateTime);
-        Page<CoverVo> result = coverMapper.selectVoPage(pageQuery.build(), queryWrapper);
-        return TableDataInfo.build(result);
-    }
-
-    public String getKey(String key) {
-        return configService.getConfigValue("cover", key);
-    }
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/PaymentOrdersServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/PaymentOrdersServiceImpl.java
deleted file mode 100644
index 1415aaa..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/PaymentOrdersServiceImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollectionUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.domain.model.LoginUser;
-import org.ruoyi.common.core.exception.base.BaseException;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.system.domain.PaymentOrder;
-import org.ruoyi.system.domain.SysUser;
-import org.ruoyi.system.domain.bo.PaymentOrdersBo;
-import org.ruoyi.system.domain.bo.SysPackagePlanBo;
-import org.ruoyi.system.domain.bo.SysUserBo;
-import org.ruoyi.system.domain.request.OrderRequest;
-import org.ruoyi.system.domain.vo.PaymentOrdersVo;
-import org.ruoyi.system.domain.vo.SysPackagePlanVo;
-import org.ruoyi.system.domain.vo.SysUserVo;
-import org.ruoyi.system.mapper.PaymentOrdersMapper;
-import org.ruoyi.system.mapper.SysUserMapper;
-import org.ruoyi.system.service.IPaymentOrdersService;
-import org.ruoyi.system.service.ISysPackagePlanService;
-import org.ruoyi.system.service.ISysUserService;
-import org.ruoyi.system.util.OrderNumberGenerator;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * 鏀粯璁㈠崟Service涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-04-16
- */
-@RequiredArgsConstructor
-@Service
-public class PaymentOrdersServiceImpl implements IPaymentOrdersService {
-
-    private final PaymentOrdersMapper baseMapper;
-
-    private final SysUserMapper sysUserMapper;
-
-    private final ISysUserService userService;
-
-    private final ISysPackagePlanService planService;
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟
-     */
-    @Override
-    public PaymentOrdersVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鍒涘缓鏀粯璁㈠崟
-     */
-    @Override
-    public PaymentOrdersBo createPayOrder(OrderRequest orderRequest) {
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        PaymentOrdersBo paymentOrder = new PaymentOrdersBo();
-        paymentOrder.setOrderName(orderRequest.getName());
-        paymentOrder.setAmount(new BigDecimal(orderRequest.getMoney()));
-        paymentOrder.setOrderNo(OrderNumberGenerator.generate());
-        paymentOrder.setUserId(loginUser.getUserId());
-        // TODO 鏀粯鐘舵�侀粯璁ゅ緟鏀粯 - 娣诲姞鏋氫妇
-        paymentOrder.setPaymentStatus("1");
-        // 淇濆瓨鏀粯璁㈠崟
-        insertByBo(paymentOrder);
-        return paymentOrder;
-    }
-
-    /**
-     * 淇敼璁㈠崟鐘舵�佷负宸叉敮浠�
-     *
-     */
-    @Override
-    public void updatePayOrder(OrderRequest orderRequest) {
-        PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
-        paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
-        List<PaymentOrdersVo> paymentOrdersList = queryList(paymentOrdersBo);
-        if (CollectionUtil.isEmpty(paymentOrdersList)){
-            throw new BaseException("璁㈠崟涓嶅瓨鍦紒");
-        }
-        // 鏍规嵁浠锋牸鏌ヨ濂楅
-        SysPackagePlanBo sysPackagePlanBo = new SysPackagePlanBo();
-        sysPackagePlanBo.setPrice(new BigDecimal(orderRequest.getMoney()));
-        SysPackagePlanVo sysPackagePlanVo = planService.queryList(sysPackagePlanBo).get(0);
-
-
-        // 璁㈠崟鐘舵�佷慨鏀逛负宸叉敮浠�
-        PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
-        // 1 鏈敮浠� 2鏈敮浠�
-        paymentOrdersVo.setPaymentStatus("2");
-        paymentOrdersVo.setPaymentMethod(orderRequest.getPayType());
-        BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
-        updateByBo(paymentOrdersBo);
-        // 鐢ㄦ埛鍏呭�艰垂鐢�
-        double money = paymentOrdersBo.getAmount().doubleValue();
-        SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
-        sysUserVo.setUserBalance(sysUserVo.getUserBalance() + money);
-        SysUserBo sysUserBo = new SysUserBo();
-        BeanUtil.copyProperties(sysUserVo,sysUserBo);
-        // 璁剧疆涓轰粯璐圭敤鎴�
-        sysUserBo.setUserGrade("1");
-        sysUserBo.setUserPlan(sysPackagePlanVo.getId().toString());
-        userService.updateUser(sysUserBo);
-    }
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟鍒楄〃
-     */
-    @Override
-    public TableDataInfo<PaymentOrdersVo> queryPageList(PaymentOrdersBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<PaymentOrder> lqw = buildQueryWrapper(bo);
-        Page<PaymentOrdersVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        if(CollectionUtil.isEmpty(result.getRecords())){
-            return TableDataInfo.build(result);
-        }
-        // 鑾峰彇鎵�鏈塽serId
-        List<Long> userIds = result.getRecords().stream()
-            .map(PaymentOrdersVo::getUserId)
-            .collect(Collectors.toList());
-        // 涓�娆℃�ф煡璇㈡墍鏈塽serName
-        Map<Long, String> userIdToUserNameMap = getUserNamesByUserIds(userIds);
-        // 璁剧疆userName
-        result.getRecords().forEach(paymentOrderVo -> {
-            paymentOrderVo.setUserName(userIdToUserNameMap.get(paymentOrderVo.getUserId()));
-        });
-        return TableDataInfo.build(result);
-    }
-    private Map<Long, String> getUserNamesByUserIds(List<Long> userIds) {
-        // 瀹炵幇鎵归噺鏌ヨuserName鐨勯�昏緫锛屼緥濡傞�氳繃sysUserMapper鏌ヨsys_user琛�
-        List<SysUser> sysUsers = sysUserMapper.selectBatchIds(userIds);
-        return sysUsers.stream()
-            .collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName));
-    }
-
-    /**
-     * 鏌ヨ鏀粯璁㈠崟鍒楄〃
-     */
-    @Override
-    public List<PaymentOrdersVo> queryList(PaymentOrdersBo bo) {
-        LambdaQueryWrapper<PaymentOrder> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<PaymentOrder> buildQueryWrapper(PaymentOrdersBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<PaymentOrder> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), PaymentOrder::getOrderNo, bo.getOrderNo());
-        lqw.like(StringUtils.isNotBlank(bo.getOrderName()), PaymentOrder::getOrderName, bo.getOrderName());
-        lqw.eq(bo.getAmount() != null, PaymentOrder::getAmount, bo.getAmount());
-        lqw.eq(StringUtils.isNotBlank(bo.getPaymentStatus()), PaymentOrder::getPaymentStatus, bo.getPaymentStatus());
-        lqw.eq(StringUtils.isNotBlank(bo.getPaymentMethod()), PaymentOrder::getPaymentMethod, bo.getPaymentMethod());
-        lqw.eq(bo.getUserId() != null, PaymentOrder::getUserId, bo.getUserId());
-        return lqw;
-    }
-
-    /**
-     * 鏂板鏀粯璁㈠崟
-     */
-    @Override
-    public Boolean insertByBo(PaymentOrdersBo bo) {
-        PaymentOrder add = MapstructUtils.convert(bo, PaymentOrder.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼鏀粯璁㈠崟
-     */
-    @Override
-    public Boolean updateByBo(PaymentOrdersBo bo) {
-        PaymentOrder update = MapstructUtils.convert(bo, PaymentOrder.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(PaymentOrder entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎鏀粯璁㈠崟
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/PptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/PptServiceImpl.java
deleted file mode 100644
index a3f17e9..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/PptServiceImpl.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import cn.dev33.satoken.exception.NotLoginException;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.ruoyi.common.core.constant.Constants;
-import org.ruoyi.common.core.domain.model.LoginUser;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.common.redis.utils.RedisUtils;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.system.cofing.OkHttpConfig;
-import org.ruoyi.system.domain.vo.ppt.*;
-import org.ruoyi.system.service.IPptService;
-import org.ruoyi.system.util.HttpUtils;
-import org.ruoyi.system.util.WddPptApi;
-import org.springframework.stereotype.Service;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-
-import javax.swing.filechooser.FileSystemView;
-import java.io.File;
-import java.time.Duration;
-
-/**
- * AI-PPTService涓氬姟灞傚鐞�
- *
- * @author NSL
- * @since 2024-12-30
- */
-@RequiredArgsConstructor
-@Service
-@Slf4j
-public class PptServiceImpl implements IPptService {
-
-    private final OkHttpConfig okHttpConfig;
-    private final ConfigService configService;
-    private final IChatCostService chatCostService;
-
-    @Override
-    public void syncStreamGeneratePpt(String title) {
-        // 鍒涘缓 api token (鏈夋晥鏈�2灏忔椂锛屽悓涓�涓� uid 鍒涘缓鏃朵箣鍓嶇殑 token 浼氬湪10绉掑唴澶辨晥)
-        String apiToken = getApiToken();
-        // 鐢熸垚澶х翰
-        System.out.println("\n\n========== 姝e湪鐢熸垚澶х翰 ==========");
-        String outline = WddPptApi.generateOutline(apiToken, title, null, null);
-
-        // 鐢熸垚澶х翰鍐呭
-        System.out.println("\n\n========== 姝e湪鐢熸垚澶х翰鍐呭 ==========");
-        String markdown = WddPptApi.generateContent(apiToken, outline, null, null);
-
-        // 闅忔満涓�涓ā鏉�
-        System.out.println("\n\n========== 闅忔満閫夋嫨妯℃澘 ==========");
-        String templateId = WddPptApi.randomOneTemplateId(apiToken);
-        System.out.println(templateId);
-
-        // 鐢熸垚PPT
-        System.out.println("\n\n========== 姝e湪鐢熸垚PPT ==========");
-        JSONObject pptInfo = WddPptApi.generatePptx(apiToken, templateId, markdown, false);
-        String pptId = pptInfo.getString("id");
-        System.out.println("pptId: " + pptId);
-        System.out.println("ppt涓婚锛�" + pptInfo.getString("subject"));
-        System.out.println("ppt灏侀潰锛�" + pptInfo.getString("coverUrl") + "?token=" + apiToken);
-
-        // 涓嬭浇PPT鍒版闈�
-        System.out.println("\n\n========== 姝e湪涓嬭浇PPT ==========");
-        JSONObject result = WddPptApi.downloadPptx(apiToken, pptId);
-        String url = result.getString("fileUrl");
-        System.out.println("ppt閾炬帴锛�" + url);
-        String savePath = FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath() + File.separator + pptId + ".pptx";
-        try {
-            HttpUtils.download(url, new File(savePath));
-        } catch (Exception e) {
-
-        }
-        System.out.println("ppt涓嬭浇瀹屾垚锛屼繚瀛樿矾寰勶細" + savePath);
-    }
-
-    @Override
-    public void selectPptList(PptAllQueryDto pptQueryVo) {
-        String apiToken = getApiToken();
-        // todo 鏃犳潈闄愯闂�
-        JSONObject jsonObject = WddPptApi.listAllPptx(apiToken, JSONUtil.toJsonStr(pptQueryVo));
-        System.out.println(jsonObject);
-    }
-
-    @Override
-    public JSONObject getPptTemplates(PptTemplateQueryDto pptQueryVo) {
-        return WddPptApi.getPptTemplates(getApiToken(), JSONUtil.toJsonStr(pptQueryVo));
-    }
-
-    @Override
-    public SseEmitter generateOutline(PptGenerateOutlineDto generateOutlineDto) {
-        return WddPptApi.sseGenerateOutline(getApiToken(), generateOutlineDto.getSubject(), generateOutlineDto.getDataUrl(), generateOutlineDto.getPrompt());
-    }
-
-    @Override
-    public SseEmitter generateContent(PptGenerateContentDto generateContentDto) {
-        return WddPptApi.sseGenerateContent(getApiToken(), generateContentDto.getOutlineMarkdown(), generateContentDto.getDataUrl(), generateContentDto.getPrompt());
-    }
-
-    @Override
-    public JSONObject generatePptx(PptGeneratePptxDto generatePptxDto) {
-        return WddPptApi.generatePptx(getApiToken(), generatePptxDto.getTemplateId(), generatePptxDto.getOutlineContentMarkdown(), generatePptxDto.isPptxProperty());
-    }
-
-    public String getKey(String key) {
-        return configService.getConfigValue("ppt", key);
-    }
-
-    @Override
-    public String getApiToken() {
-        LoginUser loginUser = null;
-        try {
-            loginUser = LoginHelper.getLoginUser();
-        } catch (Exception e) {
-            throw new NotLoginException(NotLoginException.NOT_TOKEN_MESSAGE, NotLoginException.NOT_TOKEN, NotLoginException.NOT_TOKEN);
-        }
-        String userId = String.valueOf(loginUser.getUserId());
-        // 鍒涘缓 api token (鏈夋晥鏈�2灏忔椂锛屽悓涓�涓� uid 鍒涘缓鏃朵箣鍓嶇殑 token 浼氬湪10绉掑唴澶辨晥)
-        String apiToken = RedisUtils.getCacheObject(Constants.WDD_TOKEN_KEY + userId);
-        if (StrUtil.isEmpty(apiToken)) {
-            apiToken = WddPptApi.createApiToken(getKey("apiKey"), userId, null);
-            RedisUtils.setCacheObject(Constants.WDD_TOKEN_KEY, apiToken, Duration.ofMinutes(Constants.WDD_TOKEN_EXPIRATION));
-        }
-        return apiToken;
-    }
-
-    @Override
-    public void successCallback() {
-        // 鎵h垂
-        chatCostService.taskDeduct("ppt", "AI-PPT", NumberUtils.toDouble(okHttpConfig.getGenerate(), 1.1));
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java
deleted file mode 100644
index 807650d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java
+++ /dev/null
@@ -1,685 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import cn.dev33.satoken.stp.StpUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.zhipu.oapi.ClientV4;
-import com.zhipu.oapi.service.v4.tools.*;
-import io.github.ollama4j.OllamaAPI;
-import io.github.ollama4j.models.chat.OllamaChatMessage;
-import io.github.ollama4j.models.chat.OllamaChatMessageRole;
-import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
-import io.github.ollama4j.models.chat.OllamaChatRequestModel;
-import io.github.ollama4j.models.generate.OllamaStreamHandler;
-import jakarta.servlet.http.HttpServletRequest;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.*;
-import org.ruoyi.common.chat.config.ChatConfig;
-import org.ruoyi.common.chat.config.LocalCache;
-import org.ruoyi.common.chat.domain.request.ChatRequest;
-import org.ruoyi.common.chat.domain.request.Dall3Request;
-import org.ruoyi.common.chat.entity.Tts.TextToSpeech;
-import org.ruoyi.common.chat.entity.chat.*;
-import org.ruoyi.common.chat.entity.files.UploadFileResponse;
-import org.ruoyi.common.chat.entity.images.Image;
-import org.ruoyi.common.chat.entity.images.ImageResponse;
-import org.ruoyi.common.chat.entity.images.Item;
-import org.ruoyi.common.chat.entity.images.ResponseFormat;
-import org.ruoyi.common.chat.entity.whisper.WhisperResponse;
-import org.ruoyi.common.chat.openai.OpenAiStreamClient;
-import org.ruoyi.common.chat.openai.plugin.PluginAbstract;
-import org.ruoyi.common.chat.plugin.CmdPlugin;
-import org.ruoyi.common.chat.plugin.CmdReq;
-import org.ruoyi.common.chat.plugin.SqlPlugin;
-import org.ruoyi.common.chat.plugin.SqlReq;
-import org.ruoyi.common.chat.utils.TikTokensUtil;
-import org.ruoyi.common.core.domain.model.LoginUser;
-import org.ruoyi.common.core.exception.base.BaseException;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.core.utils.file.FileUtils;
-import org.ruoyi.common.core.utils.file.MimeTypeUtils;
-import org.ruoyi.common.satoken.utils.LoginHelper;
-import org.ruoyi.system.domain.SysModel;
-import org.ruoyi.system.domain.request.translation.TranslationRequest;
-import org.ruoyi.system.listener.SSEEventSourceListener;
-import org.ruoyi.system.service.*;
-import org.springframework.core.io.InputStreamResource;
-import org.springframework.core.io.Resource;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLEncoder;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class SseServiceImpl implements ISseService {
-
-    private OpenAiStreamClient openAiStreamClient;
-
-    ChatConfig chatConfig;
-
-    private final IChatCostService chatService;
-
-    private final IChatMessageService chatMessageService;
-
-    private final ISysModelService sysModelService;
-
-    private final ConfigService configService;
-
-    private final IChatGptsService chatGptsService;
-
-    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
-
-    private static final String requestIdTemplate = "mycompany-%d";
-
-    private static final ObjectMapper mapper = new ObjectMapper();
-
-    @Override
-    public SseEmitter sseChat(ChatRequest chatRequest, HttpServletRequest request) {
-        openAiStreamClient = chatConfig.getOpenAiStreamClient();
-        SseEmitter sseEmitter = new SseEmitter(0L);
-        SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(sseEmitter);
-        // 鑾峰彇瀵硅瘽娑堟伅鍒楄〃
-        List<Message> messages = chatRequest.getMessages();
-
-        try {
-            String chatString = null;
-            Object content = messages.get(messages.size() - 1).getContent();
-            if (content instanceof List<?> listContent) {
-                if (!listContent.isEmpty() && listContent.get(0) instanceof Content) {
-                    chatString = ((Content) listContent.get(0)).getText();
-                }
-            } else if (content instanceof String) {
-                chatString = (String) content;
-            }
-
-            String configValue = getKey("enabled");
-            if (Boolean.parseBoolean(configValue)) {
-                // 鍒ゆ柇鏂囨湰鏄惁鍚堣
-                String type = textReview(chatString);
-                // 瀹℃牳鐘舵�� 1 浠h〃鍚堟硶
-                if (!"1".equals(type) && StringUtils.isNotEmpty(type)) {
-                    throw new BaseException("鏂囨湰涓嶅悎瑙�,璇蜂慨鏀�!");
-                }
-            }
-
-            if (StpUtil.isLogin()) {
-                LocalCache.CACHE.put("userId", getUserId());
-
-                ChatMessageBo chatMessageBo = new ChatMessageBo();
-                chatMessageBo.setUserId(getUserId());
-                chatMessageBo.setModelName(chatRequest.getModel());
-                chatMessageBo.setContent(chatString);
-
-                String model = chatRequest.getModel();
-                SysModel sysModel = sysModelService.selectModelByName(model);
-                if (sysModel == null) {
-                    // 濡傛灉妯″瀷涓嶅瓨鍦ㄩ粯璁や娇鐢╰oken鎵h垂鏂瑰紡
-                    processByToken(chatRequest.getModel(), chatString, chatMessageBo);
-                } else {
-                    openAiStreamClient = chatConfig.createOpenAiStreamClient(sysModel.getApiHost(), sysModel.getApiKey());
-                    if (StringUtils.isNotEmpty(chatRequest.getAppId())) { // 璁剧疆搴旂敤鐨勭郴缁熻鑹蹭负鎻忚堪
-                        ChatGptsVo chatGptsVo = chatGptsService.queryById(Long.valueOf(chatRequest.getAppId()));
-                        Message sysMessage = Message.builder().content(chatGptsVo.getSystemPrompt()).role(Message.Role.SYSTEM).build();
-                        messages.add(0,sysMessage);
-                    } else {
-                        // 妯″瀷璁剧疆榛樿鎻愮ず璇�
-                        if (StringUtils.isNotEmpty(sysModel.getSystemPrompt())) {
-                            Message sysMessage = Message.builder().content(sysModel.getSystemPrompt()).role(Message.Role.SYSTEM).build();
-                            messages.add(0,sysMessage);
-                        }
-                    }
-                    // 璁¤垂绫诲瀷: 1 token鎵h垂 2 娆℃暟鎵h垂
-                    if ("2".equals(sysModel.getModelType())) {
-                        processByModelPrice(sysModel, chatMessageBo);
-                    } else {
-                        processByToken(chatRequest.getModel(), chatString, chatMessageBo);
-                    }
-                }
-            }
-            String zhipuValue = configService.getConfigValue("zhipu", "key");
-            // 娣诲姞鑱旂綉淇℃伅
-            if(StringUtils.isNotEmpty(zhipuValue)){
-                ClientV4 client = new ClientV4.Builder(zhipuValue)
-                        .networkConfig(300, 100, 100, 100, TimeUnit.SECONDS)
-                        .connectionPool(new okhttp3.ConnectionPool(8, 1, TimeUnit.SECONDS))
-                        .build();
-
-                SearchChatMessage jsonNodes = new SearchChatMessage();
-                jsonNodes.setRole(Message.Role.USER.getName());
-                jsonNodes.setContent(chatString);
-
-                String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
-                WebSearchParamsRequest chatCompletionRequest = WebSearchParamsRequest.builder()
-                        .model("web-search-pro")
-                        .stream(Boolean.TRUE)
-                        .messages(Collections.singletonList(jsonNodes))
-                        .requestId(requestId)
-                        .build();
-                WebSearchApiResponse webSearchApiResponse = client.webSearchProStreamingInvoke(chatCompletionRequest);
-                List<ChoiceDelta> choices = new ArrayList<>();
-                if (webSearchApiResponse.isSuccess()) {
-                    AtomicBoolean isFirst = new AtomicBoolean(true);
-
-                    AtomicReference<WebSearchPro> lastAccumulator = new AtomicReference<>();
-
-                    webSearchApiResponse.getFlowable().map(result -> result)
-                            .doOnNext(accumulator -> {
-                                {
-                                    if (isFirst.getAndSet(false)) {
-                                        log.info("Response: ");
-                                    }
-                                    ChoiceDelta delta = accumulator.getChoices().get(0).getDelta();
-                                    if (delta != null && delta.getToolCalls() != null) {
-                                        log.info("tool_calls: {}", mapper.writeValueAsString(delta.getToolCalls()));
-                                    }
-                                    choices.add(delta);
-                                }
-                            })
-                            .doOnComplete(() -> System.out.println("Stream completed."))
-                            .doOnError(throwable -> System.err.println("Error: " + throwable))
-                            .blockingSubscribe();
-
-                    WebSearchPro chatMessageAccumulator = lastAccumulator.get();
-
-                    webSearchApiResponse.setFlowable(null);// 鎵撳嵃鍓嶇疆绌�
-                    webSearchApiResponse.setData(chatMessageAccumulator);
-                }
-
-
-                Message message = Message.builder().role(Message.Role.ASSISTANT).content(choices.get(1).getToolCalls().toString()).build();
-                messages.add(message);
-            }
-
-            if ("openCmd".equals(chatRequest.getModel())) {
-                sseEmitter.send(cmdPlugin(messages));
-                sseEmitter.complete();
-            } else if ("sqlPlugin".equals(chatRequest.getModel())) {
-                sseEmitter.send(sqlPlugin(messages));
-                sseEmitter.complete();
-            } else {
-                ChatCompletion completion = ChatCompletion
-                        .builder()
-                        .messages(messages)
-                        .model(chatRequest.getModel())
-                        .temperature(chatRequest.getTemperature())
-                        .topP(chatRequest.getTop_p())
-                        .stream(true)
-                        .build();
-                openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener);
-            }
-        } catch (Exception e) {
-            String message = e.getMessage();
-            sendErrorEvent(sseEmitter, message);
-            return sseEmitter;
-        }
-        return sseEmitter;
-    }
-
-    public String cmdPlugin(List<Message> messages) {
-        CmdPlugin plugin = new CmdPlugin(CmdReq.class);
-        // 鎻掍欢鍚嶇О
-        plugin.setName("鍛戒护琛屽伐鍏�");
-        // 鏂规硶鍚嶇О
-        plugin.setFunction("openCmd");
-        // 鏂规硶璇存槑
-        plugin.setDescription("鎻愪緵涓�涓懡浠よ鎸囦护,姣斿<璁颁簨鏈�>,鎸囦护浣跨敤涓枃");
-
-        PluginAbstract.Arg arg = new PluginAbstract.Arg();
-        // 鍙傛暟鍚嶇О
-        arg.setName("cmd");
-        // 鍙傛暟璇存槑
-        arg.setDescription("鍛戒护琛屾寚浠�");
-        // 鍙傛暟绫诲瀷
-        arg.setType("string");
-        arg.setRequired(true);
-        plugin.setArgs(Collections.singletonList(arg));
-        //鏈夊洓涓噸杞芥柟娉曪紝閮藉彲浠ヤ娇鐢�
-        ChatCompletionResponse response = openAiStreamClient.chatCompletionWithPlugin(messages,"gpt-4o-mini",plugin);
-        return response.getChoices().get(0).getMessage().getContent().toString();
-    }
-
-    public String sqlPlugin(List<Message> messages) {
-        SqlPlugin plugin = new SqlPlugin(SqlReq.class);
-        // 鎻掍欢鍚嶇О
-        plugin.setName("鏁版嵁搴撴煡璇㈡彃浠�");
-        // 鏂规硶鍚嶇О
-        plugin.setFunction("sqlPlugin");
-        // 鏂规硶璇存槑
-        plugin.setDescription("鎻愪緵涓�涓敤鎴峰悕绉版煡璇綑棰濅俊鎭�");
-
-        PluginAbstract.Arg arg = new PluginAbstract.Arg();
-        // 鍙傛暟鍚嶇О
-        arg.setName("username");
-        // 鍙傛暟璇存槑
-        arg.setDescription("鐢ㄦ埛鍚嶇О");
-        // 鍙傛暟绫诲瀷
-        arg.setType("string");
-        arg.setRequired(true);
-        plugin.setArgs(Collections.singletonList(arg));
-        //鏈夊洓涓噸杞芥柟娉曪紝閮藉彲浠ヤ娇鐢�
-        ChatCompletionResponse response = openAiStreamClient.chatCompletionWithPlugin(messages,"gpt-4o-mini",plugin);
-        return response.getChoices().get(0).getMessage().getContent().toString();
-    }
-
-    /**
-     * 鏍规嵁娆℃暟鎵i櫎浣欓
-     *
-     * @param model         妯″瀷淇℃伅
-     * @param chatMessageBo 瀵硅瘽淇℃伅
-     */
-    private void processByModelPrice(SysModel model, ChatMessageBo chatMessageBo) {
-        double cost = model.getModelPrice();
-        chatService.deductUserBalance(getUserId(), cost);
-        chatMessageBo.setDeductCost(cost);
-        chatMessageService.insertByBo(chatMessageBo);
-    }
-
-    /**
-     * 鏍规嵁token鎵i櫎浣欓
-     *
-     * @param modelName     妯″瀷鍚嶇О
-     * @param text       娑堟伅鍐呭
-     * @param chatMessageBo 娑堟伅璁板綍
-     */
-    private void processByToken(String modelName, String text, ChatMessageBo chatMessageBo) {
-        int tokens = TikTokensUtil.tokens(modelName, text);
-        chatMessageBo.setTotalTokens(tokens);
-        chatService.deductToken(chatMessageBo);
-    }
-
-    /**
-     * 鏂囧瓧杞闊�
-     */
-    @Override
-    public ResponseEntity<Resource> textToSpeed(TextToSpeech textToSpeech) {
-        ResponseBody body = openAiStreamClient.textToSpeech(textToSpeech);
-        if (body != null) {
-            // 灏哛esponseBody杞崲涓篒nputStreamResource
-            InputStreamResource resource = new InputStreamResource(body.byteStream());
-
-            // 鍒涘缓骞惰繑鍥濺esponseEntity
-            return ResponseEntity.ok()
-                .contentType(MediaType.parseMediaType("audio/mpeg"))
-                .body(resource);
-        } else {
-            // 濡傛灉ResponseBody涓虹┖锛岃繑鍥�404鐘舵�佺爜
-            return ResponseEntity.notFound().build();
-        }
-    }
-
-
-    /**
-     * 璇煶杞枃瀛�
-     */
-    @Override
-    public WhisperResponse speechToTextTranscriptionsV2(MultipartFile file) {
-        // 纭繚鏂囦欢涓嶄负绌�
-        if (file.isEmpty()) {
-            throw new IllegalStateException("Cannot convert an empty MultipartFile");
-        }
-        if (!FileUtils.isValidFileExtention(file, MimeTypeUtils.AUDIO__EXTENSION)) {
-            throw new IllegalStateException("File Extention not supported");
-        }
-        // 鍒涘缓涓�涓枃浠跺璞�
-        File fileA = new File(System.getProperty("java.io.tmpdir") + File.separator + file.getOriginalFilename());
-        try {
-            // 灏� MultipartFile 鐨勫唴瀹瑰啓鍏ユ枃浠�
-            file.transferTo(fileA);
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to convert MultipartFile to File", e);
-        }
-        return openAiStreamClient.speechToTextTranscriptions(fileA);
-    }
-
-    @Override
-    public String chat(ChatRequest chatRequest, String userId) {
-         return  null;
-    }
-
-    /**
-     * dall-e-3缁樼敾鎺ュ彛
-     *
-     * @param request
-     * @return
-     */
-    @Override
-    public List<Item> dall3(Dall3Request request) {
-        openAiStreamClient = chatConfig.getOpenAiStreamClient();
-        chatService.checkUserGrade();
-        // DALL3 缁樺浘妯″瀷
-        Image image = Image.builder()
-            .responseFormat(ResponseFormat.URL.getName())
-            .model(Image.Model.DALL_E_3.getName())
-            .prompt(request.getPrompt())
-            .n(1)
-            .quality(request.getQuality())
-            .size(request.getSize())
-            .style(request.getStyle())
-            .build();
-        ImageResponse imageResponse = openAiStreamClient.genImages(image);
-        SysModel sysModel = sysModelService.selectModelByName(request.getModel());
-        //chatService.deductUserBalance(getUserId(),sysModelList.get(0).getModelPrice());
-        // 淇濆瓨娑堟伅璁板綍
-        ChatMessageBo chatMessageBo = new ChatMessageBo();
-        chatMessageBo.setUserId(getUserId());
-        chatMessageBo.setModelName(Image.Model.DALL_E_3.getName());
-        chatMessageBo.setContent(request.getPrompt());
-        chatMessageBo.setDeductCost(sysModel.getModelPrice());
-        chatMessageBo.setTotalTokens(0);
-        chatMessageService.insertByBo(chatMessageBo);
-        return imageResponse.getData();
-    }
-
-    @Override
-    public List<Item> wxDall(String prompt, String userId) {
-        openAiStreamClient = chatConfig.getOpenAiStreamClient();
-        // DALL3 缁樺浘妯″瀷
-        Image image = Image.builder()
-            .responseFormat(ResponseFormat.URL.getName())
-            .model(Image.Model.DALL_E_3.getName())
-            .prompt(prompt)
-            .n(1)
-            .build();
-        ImageResponse imageResponse = openAiStreamClient.genImages(image);
-        SysModel dall3 = sysModelService.selectModelByName("dall3");
-        chatService.deductUserBalance(Long.valueOf(userId), 0.3);
-        // 淇濆瓨娑堟伅璁板綍
-        ChatMessageBo chatMessageBo = new ChatMessageBo();
-        chatMessageBo.setUserId(getUserId());
-        chatMessageBo.setModelName(Image.Model.DALL_E_3.getName());
-        chatMessageBo.setContent(prompt);
-        chatMessageBo.setDeductCost(dall3.getModelPrice());
-        chatMessageBo.setTotalTokens(0);
-        chatMessageService.insertByBo(chatMessageBo);
-        return imageResponse.getData();
-    }
-
-    /**
-     * 鑾峰彇鐢ㄦ埛Id
-     *
-     * @return
-     */
-    public Long getUserId() {
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        if (loginUser == null) {
-            throw new BaseException("鐢ㄦ埛鏈櫥褰曪紒");
-        }
-        return loginUser.getUserId();
-    }
-
-    @Override
-    public UploadFileResponse upload(MultipartFile file) {
-        if (file.isEmpty()) {
-            throw new IllegalStateException("Cannot upload an empty MultipartFile");
-        }
-        if (!FileUtils.isValidFileExtention(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION)) {
-            throw new IllegalStateException("File Extention not supported");
-        }
-        openAiStreamClient = chatConfig.getOpenAiStreamClient();
-        return openAiStreamClient.uploadFile("fine-tune", convertMultiPartToFile(file));
-    }
-
-    private File convertMultiPartToFile(MultipartFile multipartFile) {
-        File file = null;
-        try {
-            // 鑾峰彇鍘熷鏂囦欢鍚�
-            String originalFileName = multipartFile.getOriginalFilename();
-            // 榛樿鎵╁睍鍚�
-            String extension = ".tmp";
-            // 灏濊瘯浠庡師濮嬫枃浠跺悕涓幏鍙栨墿灞曞悕
-            if (originalFileName != null && originalFileName.contains(".")) {
-                extension = originalFileName.substring(originalFileName.lastIndexOf("."));
-            }
-
-            // 浣跨敤鍘熷鏂囦欢鐨勬墿灞曞悕鍒涘缓涓存椂鏂囦欢
-            Path tempFile = Files.createTempFile(null, extension);
-            file = tempFile.toFile();
-
-            // 灏哅ultipartFile鐨勫唴瀹瑰啓鍏ユ枃浠�
-            try (InputStream inputStream = multipartFile.getInputStream();
-                 FileOutputStream outputStream = new FileOutputStream(file)) {
-                int read;
-                byte[] bytes = new byte[1024];
-                while ((read = inputStream.read(bytes)) != -1) {
-                    outputStream.write(bytes, 0, read);
-                }
-            } catch (IOException e) {
-                // 澶勭悊鏂囦欢鍐欏叆寮傚父
-                e.printStackTrace();
-            }
-        } catch (IOException e) {
-            // 澶勭悊涓存椂鏂囦欢鍒涘缓寮傚父
-            e.printStackTrace();
-        }
-        return file;
-    }
-
-    // 鍙戦�丼SE閿欒浜嬩欢鐨勫皝瑁呮柟娉�
-    private void sendErrorEvent(SseEmitter sseEmitter, String errorMessage) {
-        SseEmitter.SseEventBuilder event = SseEmitter.event()
-            .name("error")
-            .data(errorMessage);
-        try {
-            sseEmitter.send(event);
-        } catch (IOException e) {
-            log.error("鍙戦�佷簨浠跺け璐�: {}", e.getMessage());
-        }
-        sseEmitter.complete();
-    }
-
-    /**
-     * 鏂囨湰鍐呭瀹℃牳
-     *
-     * @param msg
-     * @return String
-     * @Date 2023/5/27
-     **/
-    public String textReview(String msg) {
-        String conclusionType = "";
-        try {
-            String text = URLEncoder.encode(msg);
-            okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/x-www-form-urlencoded");
-            RequestBody body = RequestBody.create(mediaType, "text=" + text);
-            Request request = new Request.Builder()
-                .url("https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined?access_token=" + getAccessToken())
-                .method("POST", body)
-                .addHeader("Content-Type", "application/x-www-form-urlencoded")
-                .addHeader("Accept", "application/json")
-                .build();
-            Response response = HTTP_CLIENT.newCall(request).execute();
-            JSONObject jsonObject = JSONObject.parseObject(response.body().string());
-            conclusionType = jsonObject.getString("conclusionType");
-        } catch (IOException e) {
-            log.info("鍙戠敓閿欒{}", e.getMessage());
-        }
-        return conclusionType;
-    }
-
-    /**
-     * 浠庣敤鎴风殑AK锛孲K鐢熸垚閴存潈绛惧悕锛圓ccess Token锛�
-     *
-     * @return 閴存潈绛惧悕锛圓ccess Token锛�
-     * @throws IOException IO寮傚父
-     */
-    public String getAccessToken() throws IOException {
-        okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/x-www-form-urlencoded");
-        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + getKey("apiKey")
-            + "&client_secret=" + getKey("secretKey"));
-        Request request = new Request.Builder()
-            .url("https://aip.baidubce.com/oauth/2.0/token")
-            .method("POST", body)
-            .addHeader("Content-Type", "application/x-www-form-urlencoded")
-            .build();
-        Response response = HTTP_CLIENT.newCall(request).execute();
-        return JSONObject.parseObject(response.body().string()).getString("access_token");
-    }
-
-    public String getKey(String key) {
-        return configService.getConfigValue("review", key);
-    }
-
-    /**
-     * 鑾峰彇瀹㈡埛绔殑 IP 鍦板潃
-     *
-     * @param request HTTP 璇锋眰瀵硅薄
-     * @return 瀹㈡埛绔殑 IP 鍦板潃锛屽鏋滄棤娉曡幏鍙栧垯杩斿洖 "unknown"
-     */
-    public static String getClientIpAddress(HttpServletRequest request) {
-        String ipAddress = request.getHeader("X-Forwarded-For");
-        if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
-            return ipAddress.split(",")[0].trim();
-        }
-
-        ipAddress = request.getHeader("Proxy-Client-IP");
-        if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
-            return ipAddress;
-        }
-
-        ipAddress = request.getHeader("WL-Proxy-Client-IP");
-        if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
-            return ipAddress;
-        }
-
-        ipAddress = request.getHeader("HTTP_CLIENT_IP");
-        if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
-            return ipAddress;
-        }
-
-        ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
-        if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
-            return ipAddress;
-        }
-
-        ipAddress = request.getRemoteAddr();
-        if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
-            return ipAddress;
-        }
-
-        return "unknown";
-    }
-
-
-    @Override
-    public String translation(TranslationRequest translationRequest) {
-        // 缈昏瘧妯″瀷鍥哄畾涓篻pt-4o-mini
-        translationRequest.setModel("gpt-4o-mini");
-        ChatMessageBo chatMessageBo = new ChatMessageBo();
-        chatMessageBo.setUserId(getUserId());
-        chatMessageBo.setModelName(translationRequest.getModel());
-        chatMessageBo.setContent(translationRequest.getPrompt());
-        chatMessageBo.setDeductCost(0.01);
-        chatMessageBo.setTotalTokens(0);
-        chatMessageService.insertByBo(chatMessageBo);
-        openAiStreamClient = chatConfig.getOpenAiStreamClient();
-        List<Message> messageList = new ArrayList<>();
-        Message sysMessage = Message.builder().role(Message.Role.SYSTEM).content("浣犳槸涓�浣嶇簿閫氬悇鍥借瑷�鐨勭炕璇戝ぇ甯圽n" +
-            "\n" +
-            "璇峰皢鐢ㄦ埛杈撳叆璇嶈缈昏瘧鎴恵" + translationRequest.getTargetLanguage() + "}\n" +
-            "\n" +
-            "==绀轰緥杈撳嚭==\n" +
-            "**鍘熸枃** : <杩欓噷鏄剧ず瑕佺炕璇戠殑鍘熸枃淇℃伅>\n" +
-            "**缈昏瘧** : <杩欓噷鏄剧ず缈昏瘧鎴愯嫳璇殑缁撴灉>\n" +
-            "==绀轰緥缁撴潫==\n" +
-            "\n" +
-            "娉ㄦ剰锛氳涓ユ牸鎸夌ず渚嬭繘琛岃緭鍑猴紝杩斿洖markdown鏍煎紡").build();
-        messageList.add(sysMessage);
-        Message message = Message.builder().role(Message.Role.USER).content(translationRequest.getPrompt()).build();
-        messageList.add(message);
-        ChatCompletionResponse chatCompletionResponse = null;
-        try {
-           ChatCompletion chatCompletion = ChatCompletion
-               .builder()
-               .messages(messageList)
-               .model(translationRequest.getModel())
-               .stream(false)
-               .build();
-           chatCompletionResponse = openAiStreamClient.chatCompletion(chatCompletion);
-       }catch (Exception e) {
-           log.error(e.getMessage());
-       }
-
-        return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString();
-    }
-
-    @Override
-    public SseEmitter ollamaChat(ChatRequest chatRequest) {
-        String[] parts = chatRequest.getModel().split("ollama-");
-        SysModel sysModel = sysModelService.selectModelByName(chatRequest.getModel());
-        final SseEmitter emitter = new SseEmitter();
-        String host = sysModel.getApiHost();
-        List<Message> msgList = chatRequest.getMessages();
-        List<OllamaChatMessage> messages = new ArrayList<>();
-
-        for (Message message : msgList) {
-            OllamaChatMessage ollamaChatMessage = new OllamaChatMessage();
-            ollamaChatMessage.setRole(OllamaChatMessageRole.USER);
-            ollamaChatMessage.setContent(message.getContent().toString());
-            messages.add(ollamaChatMessage);
-        }
-        OllamaAPI api = new OllamaAPI(host);
-        api.setRequestTimeoutSeconds(100);
-        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(parts[1]);
-
-        OllamaChatRequestModel requestModel = builder
-            .withMessages(messages)
-            .build();
-
-        // 寮傛鎵ц OllAma API 璋冪敤
-        CompletableFuture.runAsync(() -> {
-            try {
-                StringBuilder response = new StringBuilder();
-                OllamaStreamHandler streamHandler = (s) -> {
-                    String substr = s.substring(response.length());
-                    response.append(substr);
-                    System.out.println(substr);
-                    try {
-                        emitter.send(substr);
-                    } catch (IOException e) {
-                        sendErrorEvent(emitter, e.getMessage());
-                    }
-                };
-                api.chat(requestModel, streamHandler);
-                emitter.complete();
-            } catch (Exception e) {
-                sendErrorEvent(emitter, e.getMessage());
-            }
-        });
-        return emitter;
-    }
-
-    @Override
-    public String wxCpChat(String prompt) {
-        List<Message> messageList = new ArrayList<>();
-        Message message = Message.builder().role(Message.Role.USER).content(prompt).build();
-        messageList.add(message);
-        ChatCompletion chatCompletion = ChatCompletion
-            .builder()
-            .messages(messageList)
-            .model("gpt-4o-mini")
-            .stream(false)
-            .build();
-        ChatCompletionResponse chatCompletionResponse = openAiStreamClient.chatCompletion(chatCompletion);
-        return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString();
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysModelServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysModelServiceImpl.java
deleted file mode 100644
index d48ac6d..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysModelServiceImpl.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.SysModel;
-import org.ruoyi.system.domain.bo.SysModelBo;
-import org.ruoyi.system.domain.vo.SysModelVo;
-import org.ruoyi.system.mapper.SysModelMapper;
-import org.ruoyi.system.service.ISysModelService;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 绯荤粺妯″瀷Service涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-04-04
- */
-@RequiredArgsConstructor
-@Service
-public class SysModelServiceImpl implements ISysModelService {
-
-    private final SysModelMapper baseMapper;
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷
-     */
-    @Override
-    public SysModelVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷鍒楄〃
-     */
-    @Override
-    public TableDataInfo<SysModelVo> queryPageList(SysModelBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<SysModel> lqw = buildQueryWrapper(bo);
-        Page<SysModelVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ绯荤粺妯″瀷鍒楄〃
-     */
-    @Override
-    public List<SysModelVo> queryList(SysModelBo bo) {
-        LambdaQueryWrapper<SysModel> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<SysModel> buildQueryWrapper(SysModelBo bo) {
-        LambdaQueryWrapper<SysModel> lqw = Wrappers.lambdaQuery();
-        lqw.like(StringUtils.isNotBlank(bo.getModelName()), SysModel::getModelName, bo.getModelName());
-        lqw.like(StringUtils.isNotBlank(bo.getModelShow()), SysModel::getModelShow, bo.getModelShow());
-        lqw.eq(StringUtils.isNotBlank(bo.getModelDescribe()), SysModel::getModelDescribe, bo.getModelDescribe());
-        lqw.eq(StringUtils.isNotBlank(bo.getModelType()), SysModel::getModelType, bo.getModelType());
-        lqw.eq(StringUtils.isNotBlank(bo.getCategory()), SysModel::getCategory, bo.getCategory());
-        return lqw;
-    }
-
-    /**
-     * 鏂板绯荤粺妯″瀷
-     */
-    @Override
-    public Boolean insertByBo(SysModelBo bo) {
-        SysModel add = MapstructUtils.convert(bo, SysModel.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼绯荤粺妯″瀷
-     */
-    @Override
-    public Boolean updateByBo(SysModelBo bo) {
-        SysModel update = MapstructUtils.convert(bo, SysModel.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(SysModel entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎绯荤粺妯″瀷
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-
-    @Override
-    public SysModel selectModelByName(String modelName) {
-        return baseMapper.selectOne(
-                new LambdaQueryWrapper<SysModel>().eq(SysModel::getModelName, modelName)
-        );
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPackagePlanServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPackagePlanServiceImpl.java
deleted file mode 100644
index 06dc539..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysPackagePlanServiceImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.SysPackagePlan;
-import org.ruoyi.system.domain.bo.SysPackagePlanBo;
-import org.ruoyi.system.domain.vo.SysPackagePlanVo;
-import org.ruoyi.system.mapper.SysPackagePlanMapper;
-import org.ruoyi.system.service.ISysPackagePlanService;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 濂楅绠$悊Service涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-05-05
- */
-@RequiredArgsConstructor
-@Service
-public class SysPackagePlanServiceImpl implements ISysPackagePlanService {
-
-    private final SysPackagePlanMapper baseMapper;
-
-    /**
-     * 鏌ヨ濂楅绠$悊
-     */
-    @Override
-    public SysPackagePlanVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ濂楅绠$悊鍒楄〃
-     */
-    @Override
-    public TableDataInfo<SysPackagePlanVo> queryPageList(SysPackagePlanBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<SysPackagePlan> lqw = buildQueryWrapper(bo);
-        Page<SysPackagePlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ濂楅绠$悊鍒楄〃
-     */
-    @Override
-    public List<SysPackagePlanVo> queryList(SysPackagePlanBo bo) {
-        LambdaQueryWrapper<SysPackagePlan> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<SysPackagePlan> buildQueryWrapper(SysPackagePlanBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<SysPackagePlan> lqw = Wrappers.lambdaQuery();
-        lqw.like(StringUtils.isNotBlank(bo.getName()), SysPackagePlan::getName, bo.getName());
-        lqw.eq(bo.getPrice() != null, SysPackagePlan::getPrice, bo.getPrice());
-        lqw.eq(bo.getDuration() != null, SysPackagePlan::getDuration, bo.getDuration());
-        lqw.eq(StringUtils.isNotBlank(bo.getPlanDetail()), SysPackagePlan::getPlanDetail, bo.getPlanDetail());
-        return lqw;
-    }
-
-    /**
-     * 鏂板濂楅绠$悊
-     */
-    @Override
-    public Boolean insertByBo(SysPackagePlanBo bo) {
-        SysPackagePlan add = MapstructUtils.convert(bo, SysPackagePlan.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼濂楅绠$悊
-     */
-    @Override
-    public Boolean updateByBo(SysPackagePlanBo bo) {
-        SysPackagePlan update = MapstructUtils.convert(bo, SysPackagePlan.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(SysPackagePlan entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎濂楅绠$悊
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java
deleted file mode 100644
index 7da71d5..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserGroupServiceImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.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.ruoyi.system.domain.bo.SysUserGroupBo;
-import org.ruoyi.system.domain.vo.SysUserGroupVo;
-import org.ruoyi.system.domain.SysUserGroup;
-import org.ruoyi.system.mapper.SysUserGroupMapper;
-import org.ruoyi.system.service.ISysUserGroupService;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@RequiredArgsConstructor
-@Service
-public class SysUserGroupServiceImpl implements ISysUserGroupService {
-
-    private final SysUserGroupMapper baseMapper;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public SysUserGroupVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public TableDataInfo<SysUserGroupVo> queryPageList(SysUserGroupBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<SysUserGroup> lqw = buildQueryWrapper(bo);
-        Page<SysUserGroupVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public List<SysUserGroupVo> queryList(SysUserGroupBo bo) {
-        LambdaQueryWrapper<SysUserGroup> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<SysUserGroup> buildQueryWrapper(SysUserGroupBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<SysUserGroup> lqw = Wrappers.lambdaQuery();
-        lqw.like(StringUtils.isNotBlank(bo.getGroupName()), SysUserGroup::getGroupName, bo.getGroupName());
-        lqw.eq(StringUtils.isNotBlank(bo.getUpdateIp()), SysUserGroup::getUpdateIp, bo.getUpdateIp());
-        return lqw;
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean insertByBo(SysUserGroupBo bo) {
-        SysUserGroup add = MapstructUtils.convert(bo, SysUserGroup.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean updateByBo(SysUserGroupBo bo) {
-        SysUserGroup update = MapstructUtils.convert(bo, SysUserGroup.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(SysUserGroup entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserModelServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserModelServiceImpl.java
deleted file mode 100644
index 1a401c7..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysUserModelServiceImpl.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.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.ruoyi.system.domain.bo.SysUserModelBo;
-import org.ruoyi.system.domain.vo.SysUserModelVo;
-import org.ruoyi.system.domain.SysUserModel;
-import org.ruoyi.system.mapper.SysUserModelMapper;
-import org.ruoyi.system.service.ISysUserModelService;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-08-03
- */
-@RequiredArgsConstructor
-@Service
-public class SysUserModelServiceImpl implements ISysUserModelService {
-
-    private final SysUserModelMapper baseMapper;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public SysUserModelVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public TableDataInfo<SysUserModelVo> queryPageList(SysUserModelBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<SysUserModel> lqw = buildQueryWrapper(bo);
-        Page<SysUserModelVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public List<SysUserModelVo> queryList(SysUserModelBo bo) {
-        LambdaQueryWrapper<SysUserModel> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<SysUserModel> buildQueryWrapper(SysUserModelBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<SysUserModel> lqw = Wrappers.lambdaQuery();
-        lqw.eq(bo.getMid() != null, SysUserModel::getMid, bo.getMid());
-        lqw.eq(bo.getGid() != null, SysUserModel::getGid, bo.getGid());
-        return lqw;
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean insertByBo(SysUserModelBo bo) {
-        SysUserModel add = MapstructUtils.convert(bo, SysUserModel.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean updateByBo(SysUserModelBo bo) {
-        SysUserModel update = MapstructUtils.convert(bo, SysUserModel.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(SysUserModel entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WeixinUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WeixinUserServiceImpl.java
deleted file mode 100644
index 9c84602..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WeixinUserServiceImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import org.ruoyi.system.domain.model.ReceiveMessage;
-import org.ruoyi.system.service.WeixinUserService;
-import org.ruoyi.system.util.WeixinMsgUtil;
-import org.ruoyi.system.util.WeixinQrCodeCacheUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.Arrays;
-
-
-@Slf4j
-@Service
-public class WeixinUserServiceImpl implements WeixinUserService {
-
-    private String token = "panda";
-
-    @Override
-    public void checkSignature(String signature, String timestamp, String nonce) {
-        String[] arr = new String[] {token, timestamp, nonce};
-        Arrays.sort(arr);
-        StringBuilder content = new StringBuilder();
-        for (String str : arr) {
-            content.append(str);
-        }
-        String tmpStr = DigestUtils.sha1Hex(content.toString());
-        if (tmpStr.equals(signature)) {
-            log.info("check success");
-            return;
-        }
-        log.error("check fail");
-        throw new RuntimeException("check fail");
-    }
-
-    @Override
-    public String handleWeixinMsg(String requestBody) {
-        ReceiveMessage receiveMessage = WeixinMsgUtil.msgToReceiveMessage(requestBody);
-        // 鎵爜鐧诲綍
-        if (WeixinMsgUtil.isScanQrCode(receiveMessage)) {
-            return handleScanLogin(receiveMessage);
-        }
-        // 鍏虫敞
-        if (WeixinMsgUtil.isEventAndSubscribe(receiveMessage)) {
-            return receiveMessage.getReplyTextMsg("娆㈣繋鍏虫敞銆愮唺鐚姙鍏姪鎵嬨��,璇疯闂甴ttps://web.pandarobot.chat/浣跨敤AI鍔╂墜");
-        }
-        return receiveMessage.getReplyTextMsg("鏀跺埌锛堣嚜鍔ㄥ洖澶嶏級");
-    }
-
-    /**
-     * 澶勭悊鎵爜鐧诲綍
-     *
-     * @param receiveMessage
-     * @return
-     */
-    private String handleScanLogin(ReceiveMessage receiveMessage) {
-        String qrCodeTicket = WeixinMsgUtil.getQrCodeTicket(receiveMessage);
-        if (WeixinQrCodeCacheUtil.get(qrCodeTicket) == null) {
-            String openId = receiveMessage.getFromUserName();
-            WeixinQrCodeCacheUtil.put(qrCodeTicket, openId);
-        }
-        return receiveMessage.getReplyTextMsg("浣犲凡鎴愬姛鐧诲綍锛�");
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobConfigServiceImpl.java
deleted file mode 100644
index 18887e6..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobConfigServiceImpl.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import cn.hutool.core.collection.CollectionUtil;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.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 org.ruoyi.system.domain.SysUser;
-import org.ruoyi.system.mapper.SysUserMapper;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-import org.ruoyi.system.domain.bo.WxRobConfigBo;
-import org.ruoyi.system.domain.vo.WxRobConfigVo;
-import org.ruoyi.system.domain.WxRobConfig;
-import org.ruoyi.system.mapper.WxRobConfigMapper;
-import org.ruoyi.system.service.IWxRobConfigService;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-import java.util.stream.Collectors;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@RequiredArgsConstructor
-@Service
-public class WxRobConfigServiceImpl implements IWxRobConfigService {
-
-    private final WxRobConfigMapper baseMapper;
-
-    private final SysUserMapper sysUserMapper;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public WxRobConfigVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public TableDataInfo<WxRobConfigVo> queryPageList(WxRobConfigBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<WxRobConfig> lqw = buildQueryWrapper(bo);
-        Page<WxRobConfigVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        if(CollectionUtil.isEmpty(result.getRecords())){
-            return TableDataInfo.build(result);
-        }
-        // 鑾峰彇鎵�鏈塽serId
-        List<Long> userIds = result.getRecords().stream()
-            .map(WxRobConfigVo::getUserId)
-            .collect(Collectors.toList());
-        // 涓�娆℃�ф煡璇㈡墍鏈塽serName
-        Map<Long, String> userIdToUserNameMap = getUserNamesByUserIds(userIds);
-        // 璁剧疆userName
-        result.getRecords().forEach(wxRobConfigVo -> {
-            wxRobConfigVo.setUserName(userIdToUserNameMap.get(wxRobConfigVo.getUserId()));
-        });
-        return TableDataInfo.build(result);
-    }
-
-    private Map<Long, String> getUserNamesByUserIds(List<Long> userIds) {
-        // 瀹炵幇鎵归噺鏌ヨuserName鐨勯�昏緫锛屼緥濡傞�氳繃sysUserMapper鏌ヨsys_user琛�
-        List<SysUser> sysUsers = sysUserMapper.selectBatchIds(userIds);
-        return sysUsers.stream()
-            .collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName));
-    }
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public List<WxRobConfigVo> queryList(WxRobConfigBo bo) {
-        LambdaQueryWrapper<WxRobConfig> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<WxRobConfig> buildQueryWrapper(WxRobConfigBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<WxRobConfig> lqw = Wrappers.lambdaQuery();
-        lqw.eq(bo.getUserId() != null, WxRobConfig::getUserId, bo.getUserId());
-        lqw.eq(StringUtils.isNotBlank(bo.getUniqueKey()), WxRobConfig::getUniqueKey, bo.getUniqueKey());
-        lqw.eq(bo.getDefaultFriend() != null, WxRobConfig::getDefaultFriend, bo.getDefaultFriend());
-        lqw.eq(bo.getDefaultGroup() != null, WxRobConfig::getDefaultGroup, bo.getDefaultGroup());
-        lqw.eq(bo.getEnable() != null, WxRobConfig::getEnable, bo.getEnable());
-        return lqw;
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean insertByBo(WxRobConfigBo bo) {
-        WxRobConfig add = MapstructUtils.convert(bo, WxRobConfig.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean updateByBo(WxRobConfigBo bo) {
-        WxRobConfig update = MapstructUtils.convert(bo, WxRobConfig.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(WxRobConfig entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobKeywordServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobKeywordServiceImpl.java
deleted file mode 100644
index 461ca1a..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobKeywordServiceImpl.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.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.ruoyi.system.domain.bo.WxRobKeywordBo;
-import org.ruoyi.system.domain.vo.WxRobKeywordVo;
-import org.ruoyi.system.domain.WxRobKeyword;
-import org.ruoyi.system.mapper.WxRobKeywordMapper;
-import org.ruoyi.system.service.IWxRobKeywordService;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@RequiredArgsConstructor
-@Service
-public class WxRobKeywordServiceImpl implements IWxRobKeywordService {
-
-    private final WxRobKeywordMapper baseMapper;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public WxRobKeywordVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public TableDataInfo<WxRobKeywordVo> queryPageList(WxRobKeywordBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<WxRobKeyword> lqw = buildQueryWrapper(bo);
-        Page<WxRobKeywordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public List<WxRobKeywordVo> queryList(WxRobKeywordBo bo) {
-        LambdaQueryWrapper<WxRobKeyword> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<WxRobKeyword> buildQueryWrapper(WxRobKeywordBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<WxRobKeyword> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getUniqueKey()), WxRobKeyword::getUniqueKey, bo.getUniqueKey());
-        lqw.eq(StringUtils.isNotBlank(bo.getKeyData()), WxRobKeyword::getKeyData, bo.getKeyData());
-        lqw.eq(StringUtils.isNotBlank(bo.getValueData()), WxRobKeyword::getValueData, bo.getValueData());
-        lqw.eq(StringUtils.isNotBlank(bo.getTypeData()), WxRobKeyword::getTypeData, bo.getTypeData());
-        lqw.like(StringUtils.isNotBlank(bo.getNickName()), WxRobKeyword::getNickName, bo.getNickName());
-        lqw.eq(bo.getToGroup() != null, WxRobKeyword::getToGroup, bo.getToGroup());
-        lqw.eq(bo.getEnable() != null, WxRobKeyword::getEnable, bo.getEnable());
-        return lqw;
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean insertByBo(WxRobKeywordBo bo) {
-        WxRobKeyword add = MapstructUtils.convert(bo, WxRobKeyword.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean updateByBo(WxRobKeywordBo bo) {
-        WxRobKeyword update = MapstructUtils.convert(bo, WxRobKeyword.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(WxRobKeyword entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobRelationServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobRelationServiceImpl.java
deleted file mode 100644
index bfb2cb0..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/WxRobRelationServiceImpl.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.common.core.utils.MapstructUtils;
-import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.mybatis.core.page.PageQuery;
-import org.ruoyi.common.mybatis.core.page.TableDataInfo;
-import org.ruoyi.system.domain.WxRobRelation;
-import org.ruoyi.system.domain.bo.WxRobRelationBo;
-import org.ruoyi.system.domain.vo.WxRobRelationVo;
-import org.ruoyi.system.mapper.WxRobRelationMapper;
-import org.ruoyi.system.service.IWxRobRelationService;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
- *
- * @author Lion Li
- * @date 2024-05-01
- */
-@RequiredArgsConstructor
-@Service
-public class WxRobRelationServiceImpl implements IWxRobRelationService {
-
-    private final WxRobRelationMapper baseMapper;
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public WxRobRelationVo queryById(Long id){
-        return baseMapper.selectVoById(id);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public TableDataInfo<WxRobRelationVo> queryPageList(WxRobRelationBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<WxRobRelation> lqw = buildQueryWrapper(bo);
-        Page<WxRobRelationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
-     */
-    @Override
-    public List<WxRobRelationVo> queryList(WxRobRelationBo bo) {
-        LambdaQueryWrapper<WxRobRelation> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
-
-    private LambdaQueryWrapper<WxRobRelation> buildQueryWrapper(WxRobRelationBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<WxRobRelation> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getOutKey()), WxRobRelation::getOutKey, bo.getOutKey());
-        lqw.eq(StringUtils.isNotBlank(bo.getUniqueKey()), WxRobRelation::getUniqueKey, bo.getUniqueKey());
-        lqw.like(StringUtils.isNotBlank(bo.getNickName()), WxRobRelation::getNickName, bo.getNickName());
-        lqw.eq(bo.getToGroup() != null, WxRobRelation::getToGroup, bo.getToGroup());
-        lqw.eq(bo.getEnable() != null, WxRobRelation::getEnable, bo.getEnable());
-        lqw.eq(StringUtils.isNotBlank(bo.getWhiteList()), WxRobRelation::getWhiteList, bo.getWhiteList());
-        return lqw;
-    }
-
-    /**
-     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean insertByBo(WxRobRelationBo bo) {
-        WxRobRelation add = MapstructUtils.convert(bo, WxRobRelation.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-        }
-        return flag;
-    }
-
-    /**
-     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean updateByBo(WxRobRelationBo bo) {
-        WxRobRelation update = MapstructUtils.convert(bo, WxRobRelation.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
-
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(WxRobRelation entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
-    }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java
deleted file mode 100644
index 49d2b18..0000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/util/WeixinApiUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.ruoyi.system.util;
-
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import org.ruoyi.common.core.service.ConfigService;
-import org.ruoyi.system.domain.model.WeixinQrCode;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.net.URI;
-import java.time.LocalDateTime;
-
-/**
- * @author https://www.wdbyte.com
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeixinApiUtil {
-
-    private final ConfigService configService;
-
-    private static String QR_CODE_URL_PREFIX = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";
-
-    private static String ACCESS_TOKEN = null;
-    private static LocalDateTime ACCESS_TOKEN_EXPIRE_TIME = null;
-    /**
-     * 浜岀淮鐮� Ticket 杩囨湡鏃堕棿
-     */
-    private static int QR_CODE_TICKET_TIMEOUT = 10 * 60;
-
-    /**
-     * 鑾峰彇 access token
-     *
-     * @return
-     */
-    public synchronized String getAccessToken() {
-        if (ACCESS_TOKEN != null && ACCESS_TOKEN_EXPIRE_TIME.isAfter(LocalDateTime.now())) {
-            return ACCESS_TOKEN;
-        }
-        String api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + getKey("appid") + "&secret="
-            + getKey("secret");
-        String result = HttpUtil.get(api);
-        JSONObject jsonObject = JSON.parseObject(result);
-        ACCESS_TOKEN = jsonObject.getString("access_token");
-        ACCESS_TOKEN_EXPIRE_TIME = LocalDateTime.now().plusSeconds(jsonObject.getLong("expires_in") - 10);
-        return ACCESS_TOKEN;
-    }
-
-    /**
-     * 鑾峰彇浜岀淮鐮� Ticket
-     *
-     * https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html
-     *
-     * @return
-     */
-    public WeixinQrCode getQrCode() {
-        String api = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + getAccessToken();
-        String jsonBody = String.format("{\n"
-            + "  \"expire_seconds\": %d,\n"
-            + "  \"action_name\": \"QR_STR_SCENE\",\n"
-            + "  \"action_info\": {\n"
-            + "    \"scene\": {\n"
-            + "      \"scene_str\": \"%s\"\n"
-            + "    }\n"
-            + "  }\n"
-            + "}", QR_CODE_TICKET_TIMEOUT, KeyUtils.uuid32());
-        String result = HttpUtil.post(api, jsonBody);
-        log.info("get qr code params:{}", jsonBody);
-        log.info("get qr code result:{}", result);
-        WeixinQrCode weixinQrCode = JSON.parseObject(result, WeixinQrCode.class);
-        weixinQrCode.setQrCodeUrl(QR_CODE_URL_PREFIX + URI.create(weixinQrCode.getTicket()).toASCIIString());
-        return weixinQrCode;
-    }
-
-    public String getKey(String key) {
-        return configService.getConfigValue("weixin", key);
-    }
-}
diff --git a/ruoyi-modules/ruoyi-weixin/pom.xml b/ruoyi-modules/ruoyi-weixin/pom.xml
deleted file mode 100644
index 3e067c0..0000000
--- a/ruoyi-modules/ruoyi-weixin/pom.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.ruoyi</groupId>
-        <artifactId>ruoyi-ai</artifactId>
-        <version>1.0.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>ruoyi-weixin</artifactId>
-
-    <properties>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-</project>
diff --git a/script/docker/localModels/Dockerfile b/script/docker/localModels/Dockerfile
deleted file mode 100644
index 0f1e606..0000000
--- a/script/docker/localModels/Dockerfile
+++ /dev/null
@@ -1,26 +0,0 @@
-# 浣跨敤 Python 3.8 slim 浣滀负鍩虹闀滃儚锛堣交閲忕ǔ瀹氾級
-FROM python:3.10
-
-# 璁剧疆宸ヤ綔鐩綍
-WORKDIR /app
-
-# 澶嶅埗鎵�鏈夋枃浠跺埌瀹瑰櫒
-COPY . /app
-
-# 鏇存柊 pip 骞跺畨瑁� wheel锛堥伩鍏嶄緷璧栭棶棰橈級
-RUN pip install --upgrade pip wheel
- 
-# 浣跨敤闃块噷浜� PyPI 闀滃儚瀹夎渚濊禆锛屽苟娣诲姞 trusted-host
-RUN pip install -i https://mirrors.aliyun.com/pypi/simple \
-    --trusted-host mirrors.aliyun.com \
-    --no-cache-dir -r requirements.txt
-
-# 鏆撮湶 Flask 绔彛
-EXPOSE 5000
-
-# 璁剧疆鐜鍙橀噺
-ENV FLASK_APP=app.py
-ENV FLASK_RUN_HOST=0.0.0.0
-
-# 杩愯 Flask
-CMD ["flask", "run", "--host=0.0.0.0"]
diff --git a/script/docker/localModels/app.py b/script/docker/localModels/app.py
deleted file mode 100644
index 645a9b4..0000000
--- a/script/docker/localModels/app.py
+++ /dev/null
@@ -1,116 +0,0 @@
-from flask import Flask, request, jsonify
-from sentence_transformers import SentenceTransformer
-from sklearn.metrics.pairwise import cosine_similarity
-import json
-
-app = Flask(__name__)
-
-# 鍒涘缓涓�涓叏灞�鐨勬ā鍨嬬紦瀛樺瓧鍏�
-model_cache = {}
-
-# 鍒嗗壊鏂囨湰鍧�
-def split_text(text, block_size, overlap_chars, delimiter):
-    chunks = text.split(delimiter)
-    text_blocks = []
-    current_block = ""
-
-    for chunk in chunks:
-        if len(current_block) + len(chunk) + 1 <= block_size:
-            if current_block:
-                current_block += " " + chunk
-            else:
-                current_block = chunk
-        else:
-            text_blocks.append(current_block)
-            current_block = chunk
-    if current_block:
-        text_blocks.append(current_block)
-
-    overlap_blocks = []
-    for i in range(len(text_blocks)):
-        if i > 0:
-            overlap_block = text_blocks[i - 1][-overlap_chars:] + text_blocks[i]
-            overlap_blocks.append(overlap_block)
-        overlap_blocks.append(text_blocks[i])
-
-    return overlap_blocks
-
-# 鏂囨湰鍚戦噺鍖�
-def vectorize_text_blocks(text_blocks, model):
-    return model.encode(text_blocks)
-
-# 鏂囨湰妫�绱�
-def retrieve_top_k(query, knowledge_base, k, block_size, overlap_chars, delimiter, model):
-    # 灏嗙煡璇嗗簱鎷嗗垎涓烘枃鏈潡
-    text_blocks = split_text(knowledge_base, block_size, overlap_chars, delimiter)
-    # 鍚戦噺鍖栨枃鏈潡
-    knowledge_vectors = vectorize_text_blocks(text_blocks, model)
-    # 鍚戦噺鍖栨煡璇㈡枃鏈�
-    query_vector = model.encode([query]).reshape(1, -1)
-    # 璁$畻鐩镐技搴�
-    similarities = cosine_similarity(query_vector, knowledge_vectors)
-    # 鑾峰彇鐩镐技搴︽渶楂樼殑 k 涓枃鏈潡鐨勭储寮�
-    top_k_indices = similarities[0].argsort()[-k:][::-1]
-
-    # 杩斿洖鏂囨湰鍧楀拰瀹冧滑鐨勫悜閲�
-    top_k_texts = [text_blocks[i] for i in top_k_indices]
-    top_k_embeddings = [knowledge_vectors[i] for i in top_k_indices]
-
-    return top_k_texts, top_k_embeddings
-
-@app.route('/vectorize', methods=['POST'])
-def vectorize_text():
-    # 浠庤姹備腑鑾峰彇 JSON 鏁版嵁
-    data = request.json
-    print(f"Received request data: {data}")  # 璋冭瘯杈撳嚭璇锋眰鏁版嵁
-
-    text_list = data.get("text", [])
-    model_name = data.get("model_name", "msmarco-distilbert-base-tas-b")  # 榛樿妯″瀷
-
-    delimiter = data.get("delimiter", "\n")  # 榛樿鍒嗛殧绗�
-    k = int(data.get("k", 3))  # 榛樿妫�绱㈡潯鏁�
-    block_size = int(data.get("block_size", 500))  # 榛樿鏂囨湰鍧楀ぇ灏�
-    overlap_chars = int(data.get("overlap_chars", 50))  # 榛樿閲嶅彔瀛楃鏁�
-
-    if not text_list:
-        return jsonify({"error": "Text is required."}), 400
-
-    # 妫�鏌ユā鍨嬫槸鍚﹀凡缁忓姞杞�
-    if model_name not in model_cache:
-        try:
-            model = SentenceTransformer(model_name)
-            model_cache[model_name] = model  # 缂撳瓨妯″瀷
-        except Exception as e:
-            return jsonify({"error": f"Failed to load model: {e}"}), 500
-
-    model = model_cache[model_name]
-
-    top_k_texts_all = []
-    top_k_embeddings_all = []
-
-    # 濡傛灉鍙湁涓�涓煡璇㈡枃鏈�
-    if len(text_list) == 1:
-        top_k_texts, top_k_embeddings = retrieve_top_k(text_list[0], text_list[0], k, block_size, overlap_chars, delimiter, model)
-        top_k_texts_all.append(top_k_texts)
-        top_k_embeddings_all.append(top_k_embeddings)
-    elif len(text_list) > 1:
-        # 濡傛灉澶氫釜鏌ヨ鏂囨湰锛屼緷娆″鐞�
-        for query in text_list:
-            top_k_texts, top_k_embeddings = retrieve_top_k(query, text_list[0], k, block_size, overlap_chars, delimiter, model)
-            top_k_texts_all.append(top_k_texts)
-            top_k_embeddings_all.append(top_k_embeddings)
-
-    # 灏嗗祵鍏ュ悜閲忥紙ndarray锛夎浆鎹负鍙簭鍒楀寲鐨勫垪琛�
-    top_k_embeddings_all = [[embedding.tolist() for embedding in embeddings] for embeddings in top_k_embeddings_all]
-
-    print(f"Top K texts: {top_k_texts_all}")  # 鎵撳嵃妫�绱㈠埌鐨勬枃鏈�
-    print(f"Top K embeddings: {top_k_embeddings_all}")  # 鎵撳嵃妫�绱㈠埌鐨勫悜閲�
-
-    # 杩斿洖 JSON 鏍煎紡鐨勬暟鎹�
-    return jsonify({
-
-        "topKEmbeddings": top_k_embeddings_all  # 杩斿洖宓屽叆鍚戦噺
-    })
-
-if __name__ == '__main__':
-    app.run(host="0.0.0.0", port=5000, debug=True)
diff --git a/script/docker/localModels/remade.md b/script/docker/localModels/remade.md
deleted file mode 100644
index d6af3d2..0000000
--- a/script/docker/localModels/remade.md
+++ /dev/null
@@ -1,4 +0,0 @@
-1.涓嬭浇闀滃儚
-docker pull registry.cn-hangzhou.aliyuncs.com/hejh-docker/localmodel:0.1.1
-2. 鍚姩 
-docker run -p 5000:5000  <imageId>
\ No newline at end of file
diff --git a/script/docker/localModels/requirements.txt b/script/docker/localModels/requirements.txt
deleted file mode 100644
index 2d62483..0000000
--- a/script/docker/localModels/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Flask==3.1.0
-sentence-transformers==3.4.1
-scikit-learn==1.6.1
-werkzeug>=3.1
-

--
Gitblit v1.9.3