Prechádzať zdrojové kódy

bug修复,如向量库失效问题

zhangenzhi 1 mesiac pred
rodič
commit
c8a5589474

+ 188 - 0
README.md

@@ -0,0 +1,188 @@
+## 项目启动
+1.主项目:启动pavis-webapi模块的启动类
+2.定时任务启动:启动pavis-extension模块的启动
+
+## 子项目创建
+1.子项目名称以pavis开头
+2.基础路径为com.pavis.admin
+3.类,函数创建要见词知意
+4.根据继承的框架基础类,便可以实现简单的CRUD,具体可以根据pavis-model-system模块结构进行参考
+5.所有子模块中的controller类都在pavis-webapi中,所放路径必须跟子模块名字末尾一致,可以根据pavis-model-system模块进行参考
+
+## 数据库创建
+1.创建数据库的名字后,便可根据db.changelog-master.yaml文件中的路径,自动生成所需要的表和基础数据,
+2.如果在确定基础版本后,后续想要添加新的表或基础数据的话,可以在db.changelog-master.yaml文件添加新表或新数据的所在位置,
+可根据现有的db.changelog-master.yaml文件进行参考。
+
+## 基本的系统功能
+- 仪表盘:提供工作台、分析页,工作台提供功能快捷导航入口、最新公告、动态;分析页提供全面数据可视化能力
+- 个人中心:支持基础信息修改、密码修改、邮箱绑定、手机号绑定(并提供行为验证码、短信限流等安全处理)、第三方账号绑定/解绑、头像裁剪上传
+- 消息中心:提供站内信消息统一查看、标记已读、全部已读、删除等功能(目前仅支持系统通知消息)、提供个人公告查看
+- 用户管理:管理系统用户,包含新增、修改、删除、导入、导出、重置密码、分配角色等功能
+- 角色管理:管理系统用户的功能权限及数据权限,包含新增、修改、删除、分配角色等功能
+- 菜单管理:管理系统菜单及按钮权限,支持多级菜单,动态路由,包含新增、修改、删除等功能
+- 部门管理:管理系统组织架构,包含新增、修改、删除、导出等功能,以树形列表进行展示
+- 通知公告:管理系统公告,支持设置公告的生效时间、终止时间、通知范围(所有人、指定用户)
+- 文件管理:管理系统文件,支持上传、下载、预览(目前支持图片、音视频、PDF、Word、Excel、PPT)、重命名、切换视图(列表、网格)等功能
+- 字典管理:管理系统公用数据字典,例如:消息类型。支持字典标签背景色和排序等配置
+- 系统配置:
+    - 网站配置:提供修改系统标题、Logo、favicon、版权信息等基础配置功能,以方便用户系统与其自身品牌形象保持一致
+    - 安全配置:提供密码策略修改,支持丰富的密码策略设定,包括但不限于 `密码有效期`、`密码重复次数`、`密码错误锁定账号次数、时间` 等
+    - 登录配置:提供验证码开关等登录相关配置
+    - 邮件配置:提供系统发件箱配置,也支持通过配置文件指定
+    - 短信配置:提供系统短信服务配置,也支持通过配置文件指定
+    - 存储配置:管理文件存储配置,支持本地存储、兼容 S3 协议对象存储
+    - 终端配置:多端认证管理,可设置不同的 token 有效期
+- 在线用户:管理当前登录用户,可一键踢除下线
+- 日志管理:管理系统登录日志、操作日志,支持查看日志详情,包含请求头、响应头等报文信息
+- 短信日志:管理系统短信发送日志,支持删除、导出
+- 任务管理:管理系统定时任务,包含新增、修改、删除、执行功能,支持 Cron(可配置式生成 Cron 表达式) 和固定频率
+- 任务日志:管理定时任务执行日志,包含停止、重试指定批次,查询集群各节点的详细输出日志等功能
+- 应用管理:管理第三方系统应用 AK、SK,包含新增、修改、删除、查看密钥、重置密钥等功能,支持设置密钥有效期
+- 代码生成:提供根据数据库表自动生成相应的前后端 CRUD 代码的功能,支持同步最新表结构及代码生成预览
+- AIGC平台:可配置AI大模型,向量数据库,创建RAG,ARG支持全文文档切片,向量搜索。
+- AIGC应用:创建聊天,Agent管理和工具管理
+
+## 项目结构
+pavis-admin
+├─ pavis-webapi(API 及打包部署模块)
+│  ├─ src
+│  │  ├─ main
+│  │  │  ├─ java/com/pavis/admin
+│  │  │  │  ├─ config (配置)
+│  │  │  │  ├─ controller
+│  │  │  │  │  ├─ auth(系统认证相关 API)
+│  │  │  │  │  ├─ common(通用相关 API)
+│  │  │  │  │  ├─ monitor(系统监控相关 API)
+│  │  │  │  │  ├─ system(系统管理相关 API)
+│  │  │  │  │  └─ tool(系统工具相关 API)
+│  │  │  │  └─ PavisAdminApplication.java(Pavis Admin 启动程序)
+│  │  │  └─ resources
+│  │  │     ├─ config(核心配置目录)
+│  │  │     │  ├─ application-dev.yml(开发环境配置文件)
+│  │  │     │  ├─ application-prod.yml(生产环境配置文件)
+│  │  │     │  └─ application.yml(通用配置文件)
+│  │  │     ├─ db/changelog(Liquibase 数据脚本配置目录)
+│  │  │     │  ├─ mysql(MySQL 数据库初始 SQL 脚本目录)
+│  │  │     │  ├─ postgresql(PostgreSQL 数据库初始 SQL 脚本目录)
+│  │  │     │  └─ db.changelog-master.yaml(Liquibase 变更记录文件)
+│  │  │     ├─ templates(模板配置目录,例如:邮件模板)
+│  │  │     ├─ banner.txt(Banner 配置文件)
+│  │  │     └─ logback-spring.xml(日志配置文件)
+│  │  └─ test(测试相关代码目录)
+│  └─ pom.xml(包含打包相关配置)
+├─ pavis-module-system(系统管理模块,存放系统管理相关业务功能,例如:部门管理、角色管理、用户管理等)
+│  ├─ src
+│  │  ├─ main
+│  │  │  ├─ java/com/pavis/admin
+│  │  │  │  ├─ auth(系统认证相关业务)
+│  │  │  │  │  ├─ model(系统认证相关模型)
+│  │  │  │  │  │  ├─ query(系统认证相关查询条件)
+│  │  │  │  │  │  ├─ req(系统认证相关请求对象(Request))
+│  │  │  │  │  │  └─ resp(系统认证相关响应对象(Response))
+│  │  │  │  │  └─ service(系统认证相关业务接口及实现类)
+│  │  │  │  └─ system(系统管理相关业务)
+│  │  │  │     ├─ config(系统管理相关配置)
+│  │  │  │     ├─ enums(系统管理相关枚举)
+│  │  │  │     ├─ mapper(系统管理相关 Mapper)
+│  │  │  │     ├─ model(系统管理相关模型)
+│  │  │  │     │  ├─ entity(系统管理相关实体对象)
+│  │  │  │     │  ├─ query(系统管理相关查询条件)
+│  │  │  │     │  ├─ req(系统管理相关请求对象(Request))
+│  │  │  │     │  └─ resp(系统管理相关响应对象(Response))
+│  │  │  │     ├─ service(系统管理相关业务接口及实现类)
+│  │  │  │     └─ util(系统管理相关工具类)
+│  │  │  └─ resources
+│  │  │     └─ mapper(系统管理相关 Mapper XML 文件目录)
+│  │  └─ test(测试相关代码目录)
+│  └─ pom.xml
+├─ pavis-plugin(插件模块,存放代码生成、任务调度等扩展模块)
+│  ├─ pavis-plugin-schedule(任务调度插件模块)
+│  │  ├─ src
+│  │  │  ├─ main/java/com/pavis/admin/schedule
+│  │  │  │  ├─ api(任务调度中心相关 API)
+│  │  │  │  ├─ config(任务调度相关配置)
+│  │  │  │  ├─ constant(任务调度相关常量)
+│  │  │  │  ├─ enums(任务调度相关枚举)
+│  │  │  │  ├─ model(任务调度相关模型)
+│  │  │  │  │  ├─ query(任务调度相关查询条件)
+│  │  │  │  │  ├─ req(任务调度相关请求对象(Request))
+│  │  │  │  │  └─ resp(任务调度相关响应对象(Response))
+│  │  │  │  └─ service(代码生成器相关业务接口及实现类)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  ├─ pavis-plugin-open(能力开放插件模块)
+│  │  ├─ src
+│  │  │  ├─ main/java/com/pavis/admin/open
+│  │  │  │  ├─ mapper(代码生成器相关 Mapper)
+│  │  │  │  ├─ model(能力开放相关模型)
+│  │  │  │  │  ├─ entity(能力开放相关实体对象)
+│  │  │  │  │  ├─ query(能力开放相关查询条件)
+│  │  │  │  │  ├─ req(能力开放相关请求对象(Request))
+│  │  │  │  │  └─ resp(能力开放相关响应对象(Response))
+│  │  │  │  └─ service(能力开放相关业务接口及实现类)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  ├─ pavis-plugin-generator(代码生成器插件模块)
+│  │  ├─ src
+│  │  │  ├─ main
+│  │  │  │  ├─ java/com/pavis/admin/generator
+│  │  │  │  │  ├─ config(代码生成器相关配置)
+│  │  │  │  │  ├─ enums(代码生成器相关枚举)
+│  │  │  │  │  ├─ mapper(代码生成器相关 Mapper)
+│  │  │  │  │  ├─ model(代码生成器相关模型)
+│  │  │  │  │  │  ├─ entity(代码生成器相关实体对象)
+│  │  │  │  │  │  ├─ query(代码生成器相关查询条件)
+│  │  │  │  │  │  ├─ req(代码生成器相关请求对象(Request))
+│  │  │  │  │  │  └─ resp(代码生成器相关响应对象(Response))
+│  │  │  │  │  └─ service(代码生成器相关业务接口及实现类)
+│  │  │  │  └─ resources
+│  │  │  │     ├─ templates/generator(代码生成相关模板目录)
+│  │  │  │     ├─ application.yml(代码生成配置文件)
+│  │  │  │     └─ generator.properties(代码生成类型映射配置文件)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  └─ pom.xml
+├─ pavis-common(公共模块,存放公共工具类,公共配置等)
+│  ├─ src
+│  │  ├─ main/java/com/pavis/admin/common
+│  │  │  ├─ config(公共配置)
+│  │  │  ├─ constant(公共常量)
+│  │  │  ├─ enums(公共枚举)
+│  │  │  ├─ model(公共模型)
+│  │  │  │  ├─ dto(公共 DTO(Data Transfer Object))
+│  │  │  │  ├─ req(公共请求对象(Request))
+│  │  │  │  └─ resp(公共响应对象(Response))
+│  │  │  └─ util(公共工具类)
+│  │  └─ test(测试相关代码目录)
+│  └─ pom.xml
+├─ pavis-extension(扩展模块)
+│  ├─ pavis-extension-schedule-server(任务调度服务端模块,如果想要根据其他的方式实现,可删除)
+│  │  ├─ src
+│  │  │  ├─ main
+│  │  │  │  ├─ java/com/pavis/admin/extension/schedule
+│  │  │  │  │  └─ ScheduleServerApplication.java(任务调度服务端启动程序)
+│  │  │  │  └─ resources
+│  │  │  │     ├─ config(核心配置目录)
+│  │  │  │     │  ├─ application-dev.yml(开发环境配置文件)
+│  │  │  │     │  ├─ application-prod.yml(生产环境配置文件)
+│  │  │  │     │  └─ application.yml(通用配置文件)
+│  │  │  │     ├─ db/changelog(Liquibase 数据脚本配置目录)
+│  │  │  │     │  ├─ mysql(MySQL 数据库初始 SQL 脚本目录)
+│  │  │  │     │  ├─ postgresql(PostgreSQL 数据库初始 SQL 脚本目录)
+│  │  │  │     │  └─ db.changelog-master.yaml(Liquibase 变更记录文件)
+│  │  │  │     └─ logback-spring.xml(日志配置文件)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  └─ pom.xml
+├─ .github(GitHub 相关配置目录)
+├─ .idea
+│  └─ icon.png(IDEA 项目图标)
+├─ .image(截图目录)
+├─ .style(代码格式、License文件头相关配置目录)
+├─ .gitignore(Git 忽略文件相关配置文件)
+├─ docker(项目部署相关配置目录)
+├─ CHANGELOG.md(更新日志文件)
+├─ README.md(项目 README 文件)
+├─ lombok.config(Lombok 全局配置文件)
+└─ pom.xml(包含版本锁定及全局插件相关配置)

+ 0 - 0
logs/pavis-admin-schedule-server.log


+ 1 - 1
pavis-extension/pavis-extension-schedule-server/src/main/resources/config/application-dev.yml

@@ -5,7 +5,7 @@ server:
 spring.datasource:
   url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:pavis_admin_job}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
   username: ${DB_USER:root}
-  password: ${DB_PWD:Semi.1001}
+  password: ${DB_PWD:123456}
   driver-class-name: com.mysql.cj.jdbc.Driver
 #  # PostgreSQL 配置
 #  url: jdbc:postgresql://${DB_HOST:127.0.0.1}:${DB_PORT:5432}/${DB_NAME:pavis_admin_job}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&stringtype=unspecified

+ 2 - 2
pavis-extension/pavis-extension-schedule-server/src/main/resources/config/application-prod.yml

@@ -3,9 +3,9 @@ server:
 
 --- ### 数据源配置
 spring.datasource:
-  url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:pavis_admin_job}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+  url: jdbc:mysql://${DB_HOST:192.168.1.202}:${DB_PORT:3889}/${DB_NAME:pavis_admin_job}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
   username: ${DB_USER:root}
-  password: ${DB_PWD:Semi.1001}
+  password: ${DB_PWD:123456}
   driver-class-name: com.mysql.cj.jdbc.Driver
 #  # PostgreSQL 配置
 #  url: jdbc:postgresql://${DB_HOST:127.0.0.1}:${DB_PORT:5432}/${DB_NAME:pavis_admin_job}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&stringtype=unspecified

+ 1 - 1
pavis-extension/pavis-extension-schedule-server/src/main/resources/config/application.yml

@@ -5,7 +5,7 @@ spring:
   ## 环境配置
   profiles:
     # 启用的环境
-    active: dev
+    active: prod
 
 --- ### 日志配置
 logging:

+ 1 - 1
pavis-extension/pavis-extension-schedule-server/src/main/resources/db/changelog/mysql/snail-job_data.sql

@@ -11,4 +11,4 @@ VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173
 
 -- 默认分组:continew-admin
 INSERT INTO `sj_group_config` (`id`, `namespace_id`, `group_name`, `description`, `token`, `group_status`, `version`, `group_partition`, `id_generator_mode`, `init_scene`, `create_dt`, `update_dt`)
-VALUES (1, '764d604ec6fc45f68cd92514c40e9e1a', 'continew-admin', '默认分组', 'SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj', 1, 1, 0, 2, 1, NOW(), NOW());
+VALUES (1, '764d604ec6fc45f68cd92514c40e9e1a', 'pavis-admin', '默认分组', 'SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj', 1, 1, 0, 2, 1, NOW(), NOW());

+ 31 - 25
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/core/agent/PavisAgent.java

@@ -73,7 +73,11 @@ public class PavisAgent extends ReActAgent {
      *
      * @param llmService LLM服务实例,用于处理自然语言交互
      */
-    public PavisAgent(LlmService llmService, Long planId, AgentResp agent, ToolService toolService, ToolCallingManager toolCallingManager) {
+    public PavisAgent(LlmService llmService,
+                      Long planId,
+                      AgentResp agent,
+                      ToolService toolService,
+                      ToolCallingManager toolCallingManager) {
         super(llmService);
         this.planId = planId;
         this.agent = agent;
@@ -94,22 +98,21 @@ public class PavisAgent extends ReActAgent {
 
             log.debug("Messages prepared for the prompt: {}", messages);
 
-            ChatOptions chatOptions = ToolCallingChatOptions
-                    .builder()
-                    .toolCallbacks(getToolCallList())
-                    .internalToolExecutionEnabled(false)
-                    .build();
+            ChatOptions chatOptions = ToolCallingChatOptions.builder()
+                .toolCallbacks(getToolCallList())
+                .internalToolExecutionEnabled(false)
+                .build();
 
             userPrompt = new Prompt(messages, chatOptions);
 
             log.info("prompt:{}", userPrompt.getContents());
 
             response = llmService.getAgentChatClient(String.valueOf(planId))
-                    .getChatClient()
-                    .prompt(userPrompt)
-                    .advisors(memoryAdvisor -> memoryAdvisor.param(ChatMemory.CONVERSATION_ID, String.valueOf(planId)))
-                    .call()
-                    .chatResponse();
+                .getChatClient()
+                .prompt(userPrompt)
+                .advisors(memoryAdvisor -> memoryAdvisor.param(ChatMemory.CONVERSATION_ID, String.valueOf(planId)))
+                .call()
+                .chatResponse();
 
             log.info("end calling...");
 
@@ -127,20 +130,23 @@ public class PavisAgent extends ReActAgent {
             if (!toolCalls.isEmpty()) {
                 ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(userPrompt, response);
 
-                ToolResponseMessage toolResponseMessage = (ToolResponseMessage) toolExecutionResult.conversationHistory()
-                        .get(toolExecutionResult.conversationHistory().size() - 1);
+                ToolResponseMessage toolResponseMessage = (ToolResponseMessage)toolExecutionResult.conversationHistory()
+                    .get(toolExecutionResult.conversationHistory().size() - 1);
 
                 log.info("re-prompt:{}", userPrompt.getContents());
 
-                llmService.getAgentChatClient(String.valueOf(planId)).getMemory().add(String.valueOf(planId), toolResponseMessage);
+                llmService.getAgentChatClient(String.valueOf(planId))
+                    .getMemory()
+                    .add(String.valueOf(planId), toolResponseMessage);
                 String llmCallResponse = toolResponseMessage.getResponses().get(0).responseData();
 
                 log.info("end re-calling...");
 
                 if (!llmCallResponse.isEmpty()) {
                     log.info(String.format("💬 %s's response after tool responses: %s", getName(), llmCallResponse));
-                    log.info(String.format("🧰 Tools being prepared: %s",
-                            toolCalls.stream().map(AssistantMessage.ToolCall::name).collect(Collectors.toList())));
+                    log.info(String.format("🧰 Tools being prepared: %s", toolCalls.stream()
+                        .map(AssistantMessage.ToolCall::name)
+                        .collect(Collectors.toList())));
 
                     reActRecord.setExecutionNeeded(true);
 
@@ -219,12 +225,12 @@ public class PavisAgent extends ReActAgent {
         // 为每个工具创建 FunctionToolCallback
         for (ToolCallBiFunctionDef toolDefinition : toolDefinitions) {
             FunctionToolCallback functionToolcallback = FunctionToolCallback.builder(toolDefinition
-                            .getName(), toolDefinition)
-                    .description(toolDefinition.getDescription())
-                    .inputSchema(toolDefinition.getParameters())
-                    .inputType(toolDefinition.getInputType())
-                    .toolMetadata(ToolMetadata.builder().returnDirect(toolDefinition.isReturnDirect()).build())
-                    .build();
+                .getName(), toolDefinition)
+                .description(toolDefinition.getDescription())
+                .inputSchema(toolDefinition.getParameters())
+                .inputType(toolDefinition.getInputType())
+                .toolMetadata(ToolMetadata.builder().returnDirect(toolDefinition.isReturnDirect()).build())
+                .build();
             toolDefinition.setPlanId(planId);
             ToolCallBackContext functionToolcallbackContext = new ToolCallBackContext(functionToolcallback, toolDefinition);
             toolCallbackMap.put(toolDefinition.getName(), functionToolcallbackContext);
@@ -247,10 +253,10 @@ public class PavisAgent extends ReActAgent {
     protected Message getNextStepWithEnvMessage() {
         String nextStepPrompt = """
 
-                CURRENT STEP ENVIRONMENT STATUS:
-                {current_step_env_data}
+            CURRENT STEP ENVIRONMENT STATUS:
+            {current_step_env_data}
 
-                """;
+            """;
         nextStepPrompt += this.agent.getNextStepPrompt();
         PromptTemplate promptTemplate = new PromptTemplate(nextStepPrompt);
         return promptTemplate.createMessage(getExecutionParam().getExecutionParamMap());

+ 4 - 3
pavis-module-system/src/main/java/com/pavis/admin/auth/handler/PhoneLoginHandler.java

@@ -46,10 +46,11 @@ public class PhoneLoginHandler extends AbstractLoginHandler<PhoneLoginReq> {
 
             // 设置基本信息
             user = new UserDO();
-            String username = "user_" + randomStr + IdUtil.fastSimpleUUID();
+            String uuid = IdUtil.fastSimpleUUID();
+            String username = "user_" + randomStr + uuid;
             user.setPhone(req.getPhone());
             user.setUsername(username);
-            user.setNickname(username);
+            user.setNickname("插件用户" + uuid.substring(0, 6));
             user.setIsFron(1); // 为前台角色
 
             // 保存用户并获取用户id
@@ -57,7 +58,7 @@ public class PhoneLoginHandler extends AbstractLoginHandler<PhoneLoginReq> {
             user = userService.getByPhone(req.getPhone());
 
             // 设置“插件用户角色”
-            UserRoleDO userRole = new UserRoleDO(user.getId(), 698168080014012469L);
+            UserRoleDO userRole = new UserRoleDO(user.getId(), 731501861223269261L);
             List<UserRoleDO> users = new ArrayList<>();
             users.add(userRole);
             userRoleService.saveBatch(users);

+ 43 - 0
pavis-webapi/src/main/java/com/pavis/admin/controller/aigc/KnowledgeController.java

@@ -1,6 +1,13 @@
 package com.pavis.admin.controller.aigc;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.pavis.admin.aigc.core.llm.provider.KnowledgeStoreFactory;
+import com.pavis.admin.aigc.mapper.KnowledgeMapper;
+import com.pavis.admin.aigc.model.entity.KnowledgeDO;
 import io.swagger.v3.oas.annotations.Operation;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import top.continew.starter.core.exception.BusinessException;
 import top.continew.starter.extension.crud.enums.Api;
 
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -14,6 +21,10 @@ import com.pavis.admin.aigc.model.req.KnowledgeReq;
 import com.pavis.admin.aigc.model.resp.KnowledgeDetailResp;
 import com.pavis.admin.aigc.model.resp.KnowledgeResp;
 import com.pavis.admin.aigc.service.KnowledgeService;
+import top.continew.starter.extension.crud.model.resp.IdResp;
+import top.continew.starter.extension.crud.validation.CrudValidationGroup;
+
+import java.util.List;
 
 /**
  * AIGC知识库管理 API
@@ -26,9 +37,41 @@ import com.pavis.admin.aigc.service.KnowledgeService;
 @CrudRequestMapping(value = "/aigc/knowledge", api = {Api.PAGE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE,
     Api.EXPORT})
 public class KnowledgeController extends BaseController<KnowledgeService, KnowledgeResp, KnowledgeDetailResp, KnowledgeQuery, KnowledgeReq> {
+    @Resource
+    private KnowledgeMapper knowledgeMapper;
+
+    @Resource
+    private KnowledgeStoreFactory knowledgeStoreFactory;
+
     @Operation(summary = "(新)知识库删除接口", description = "(新)知识库删除接口")
     @PostMapping(value = "/delKnowAndDocAndSlice/{knowledgeId}")
     public void delModelAndSecrt(@PathVariable Long knowledgeId) {
         baseService.delKnowAndDocAndSlice(knowledgeId);
+        knowledgeStoreFactory.init();
+    }
+
+    @Override
+    @Operation(summary = "新增数据", description = "新增数据")
+    public IdResp<Long> create(@Validated(CrudValidationGroup.Create.class) @RequestBody KnowledgeReq req) {
+        List<KnowledgeDO> list = knowledgeMapper.selectList(new QueryWrapper<KnowledgeDO>().eq("name", req.getName()));
+        if (!list.isEmpty()) {
+            throw new BusinessException("知识库名字重复!!!");
+        }
+        IdResp<Long> longIdResp = super.create(req);
+        knowledgeStoreFactory.init();
+        return longIdResp;
+    }
+
+    @Override
+    @Operation(summary = "更新数据", description = "更新数据")
+    public void update(@Validated(CrudValidationGroup.Update.class) @RequestBody KnowledgeReq req,
+                       @PathVariable("id") Long id) {
+        List<KnowledgeDO> list = knowledgeMapper.selectList(new QueryWrapper<KnowledgeDO>().eq("name", req.getName())
+            .ne("id", id));
+        if (!list.isEmpty()) {
+            throw new BusinessException("知识库名字重复!!!");
+        }
+        super.update(req, id);
+        knowledgeStoreFactory.init();
     }
 }

+ 3 - 0
pavis-webapi/src/main/java/com/pavis/admin/controller/aigc/ModelController.java

@@ -3,6 +3,7 @@ package com.pavis.admin.controller.aigc;
 import com.pavis.admin.aigc.core.SpringContextHolder;
 import com.pavis.admin.aigc.event.ProviderRefreshEvent;
 import io.swagger.v3.oas.annotations.Operation;
+import jakarta.annotation.Resource;
 import top.continew.starter.extension.crud.enums.Api;
 
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -29,6 +30,8 @@ import java.util.List;
 @RestController
 @CrudRequestMapping(value = "/aigc/model", api = {Api.PAGE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE, Api.EXPORT})
 public class ModelController extends BaseController<ModelService, ModelResp, ModelDetailResp, ModelQuery, ModelReq> {
+    @Resource
+    private SpringContextHolder contextHolder;
     @Operation(summary = "模型和配置新增接口", description = "模型和配置新增接口")
     @PostMapping(value = "/insModelAndSecret")
     public void insModelAndSecret(@RequestBody ModelReq modelReq) {

+ 2 - 2
pavis-webapi/src/main/resources/config/application-prod.yml

@@ -58,7 +58,7 @@ spring.data:
     # 地址
     host: ${REDIS_HOST:192.168.1.202}
     # 端口(默认 6379)
-    port: ${REDIS_PORT:6388}
+    port: ${REDIS_PORT:6389}
     # 密码(未设置密码时请注释掉)
     # password: ${REDIS_PWD:123456}
     # 数据库索引
@@ -274,7 +274,7 @@ snail-job:
     # API 配置
     api:
       # URL
-      url: http://127.0.0.1:8001/snail-job
+      url: http://192.168.1.202:18001/snail-job
       # 用户名
       username: ${SCHEDULE_USERNAME:admin}
       # 密码

+ 2 - 3
pavis-webapi/src/main/resources/db/changelog/mysql/main_data.sql

@@ -641,6 +641,5 @@ INSERT INTO `aigc_model_secret`(`id`, `model_id`, `api_key`, `secret_key`, `base
 INSERT INTO `aigc_model_secret`(`id`, `model_id`, `api_key`, `secret_key`, `base_url`, `api_version`, `dimension`, `create_user`, `create_time`, `update_user`, `update_time`) VALUES (728306205247717378, 728306205046390785, 'sk-e9855234f47346049809ce23ed3ebe3f', NULL, NULL, NULL, NULL, 1, '2025-06-25 17:48:51', NULL, NULL);
 
 
-INSERT INTO `aigc_embed_store`(`id`, `name`, `provider`, `endpoints`, `auth_config`, `database_config`, `vector_config`, `pool_config`, `proxy_config`, `last_health`, `health_status`, `vector_count`, `storage_usage`, `create_user`, `create_time`, `update_user`, `update_time`) VALUES (723469589962330143, 'redis向量库', 'Redis', '{\"host\": \"192.168.1.202\", \"port\": 6599}', '{\"password\": \"redis-stack\", \"username\": \"default\"}', '{\"table\": \"\", \"database\": \"0\"}', '{\"max_conn\": 16, \"dimension\": 1024, \"index_type\": \"HNSW\", \"metric_type\": \"L2\"}', NULL, NULL, NULL, 0, 0, 0, 1, '2025-06-12 09:29:52', 1, '2025-06-25 17:54:30');
-INSERT INTO `aigc_embed_store`(`id`, `name`, `provider`, `endpoints`, `auth_config`, `database_config`, `vector_config`, `pool_config`, `proxy_config`, `last_health`, `health_status`, `vector_count`, `storage_usage`, `create_user`, `create_time`, `update_user`, `update_time`) VALUES (727822627422388537, 'redis向量库一库', 'Redis', '{\"host\": \"192.168.1.202\", \"port\": 6599}', '{\"password\": \"redis-stack\", \"username\": \"default\"}', '{\"table\": \"\", \"database\": \"1\"}', '{\"max_conn\": 16, \"dimension\": 1024, \"index_type\": \"HNSW\", \"metric_type\": \"L2\"}', NULL, NULL, NULL, 0, 0, 0, 1, '2025-06-24 09:47:17', NULL, NULL);
-INSERT INTO `aigc_embed_store`(`id`, `name`, `provider`, `endpoints`, `auth_config`, `database_config`, `vector_config`, `pool_config`, `proxy_config`, `last_health`, `health_status`, `vector_count`, `storage_usage`, `create_user`, `create_time`, `update_user`, `update_time`) VALUES (728548067913023489, 'redis向量库五库', 'Redis', '{\"host\": \"192.168.1.202\", \"port\": 6599}', '{\"password\": \"redis-stack\", \"username\": \"default\"}', '{\"table\": \"\", \"database\": \"5\"}', '{\"max_conn\": 16, \"dimension\": 1024, \"index_type\": \"HNSW\", \"metric_type\": \"L2\"}', NULL, NULL, NULL, 0, 0, 0, 1, '2025-06-26 09:49:55', 1, '2025-06-26 09:50:30');
+INSERT INTO `aigc_embed_store`(`id`, `name`, `provider`, `endpoints`, `auth_config`, `database_config`, `vector_config`, `pool_config`, `proxy_config`, `last_health`, `health_status`, `vector_count`, `storage_usage`, `create_user`, `create_time`, `update_user`, `update_time`) VALUES (723469589962330143, 'redis本地向量库', 'Redis', '{\"host\": \"192.168.1.202\", \"port\": 6599}', '{\"password\": \"redis-stack\", \"username\": \"default\"}', '{\"table\": \"\", \"database\": \"0\"}', '{\"max_conn\": 16, \"dimension\": 1024, \"index_type\": \"HNSW\", \"metric_type\": \"L2\"}', NULL, NULL, NULL, 0, 0, 0, 1, '2025-06-12 09:29:52', 1, '2025-06-25 17:54:30');
+INSERT INTO `aigc_embed_store`(`id`, `name`, `provider`, `endpoints`, `auth_config`, `database_config`, `vector_config`, `pool_config`, `proxy_config`, `last_health`, `health_status`, `vector_count`, `storage_usage`, `create_user`, `create_time`, `update_user`, `update_time`) VALUES (732530134480847172, 'Redis-202向量库', 'Redis', '{\"host\": \"192.168.1.202\", \"port\": 6489}', '{\"password\": \"redis-stack\", \"username\": \"default\"}', '{\"table\": \"\", \"database\": \"0\"}', '{\"max_conn\": 16, \"dimension\": 1024, \"index_type\": \"HNSW\", \"metric_type\": \"L2\"}', NULL, NULL, NULL, 0, 0, 0, 1, '2025-07-07 09:33:14', NULL, NULL);

+ 1 - 1
pavis-webapi/src/main/resources/db/changelog/mysql/main_table.sql

@@ -579,7 +579,7 @@ CREATE TABLE IF NOT EXISTS `aigc_doc_chunk`
     `create_time`     DATETIME        NOT NULL COMMENT '创建时间',
     `update_user`     BIGINT        DEFAULT NULL COMMENT '修改人',
     `update_time`     DATETIME      DEFAULT NULL COMMENT '修改时间',
-    `vector` json DEFAULT NULL COMMENT '向量嵌入(float数组)',
+    `vector`          TEXT COMMENT '向量嵌入(float数组)',
     PRIMARY KEY (`id`),
     KEY `idx_embed_store_id` (`embed_store_id`),
     KEY `idx_doc_id` (`doc_id`),