From 0e84f4be113fbbd2739117bb6f1935cb2eb746af Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Fri, 23 May 2025 10:05:45 +0800 Subject: [PATCH] pageQueryLlm --- .../com/zl/mjga/controller/AiController.java | 19 +++++++++-- .../java/com/zl/mjga/dto/ai/LlmUpdateDto.java | 16 --------- .../main/java/com/zl/mjga/dto/ai/LlmVm.java | 22 +++++++++++++ .../com/zl/mjga/model/urp/EPermission.java | 4 ++- .../com/zl/mjga/repository/LlmRepository.java | 32 ++++++++++++++++++ .../java/com/zl/mjga/service/LlmService.java | 33 +++++++++++++------ 6 files changed, 96 insertions(+), 30 deletions(-) delete mode 100644 backend/src/main/java/com/zl/mjga/dto/ai/LlmUpdateDto.java create mode 100644 backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java create mode 100644 backend/src/main/java/com/zl/mjga/repository/LlmRepository.java diff --git a/backend/src/main/java/com/zl/mjga/controller/AiController.java b/backend/src/main/java/com/zl/mjga/controller/AiController.java index e724b78..ad51bfe 100644 --- a/backend/src/main/java/com/zl/mjga/controller/AiController.java +++ b/backend/src/main/java/com/zl/mjga/controller/AiController.java @@ -1,15 +1,20 @@ package com.zl.mjga.controller; -import com.zl.mjga.dto.ai.LlmUpdateDto; +import com.zl.mjga.dto.PageRequestDto; +import com.zl.mjga.dto.PageResponseDto; +import com.zl.mjga.dto.ai.LlmVm; import com.zl.mjga.service.AiChatService; import com.zl.mjga.service.LlmService; import dev.langchain4j.service.TokenStream; import jakarta.validation.Valid; import java.security.Principal; import java.time.Duration; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Sinks; @@ -38,8 +43,16 @@ public class AiController { return sink.asFlux().timeout(Duration.ofSeconds(120)); } + @PreAuthorize("hasAuthority(T(com.zl.mjga.model.urp.EPermission).WRITE_LLM_CONFIG_PERMISSION)") @PutMapping(value = "/llm") - public void updateLlm(@RequestBody @Valid LlmUpdateDto llmUpdateDto) { - llmService.update(llmUpdateDto); + public void updateLlm(@RequestBody @Valid LlmVm llmVm) { + llmService.update(llmVm); + } + + @PreAuthorize("hasAuthority(T(com.zl.mjga.model.urp.EPermission).READ_LLM_CONFIG_PERMISSION)") + @GetMapping("/llm/page-query") + @ResponseStatus(HttpStatus.OK) + public PageResponseDto> pageQueryLlm(@ModelAttribute PageRequestDto pageRequestDto) { + return llmService.pageQueryLlm(pageRequestDto); } } diff --git a/backend/src/main/java/com/zl/mjga/dto/ai/LlmUpdateDto.java b/backend/src/main/java/com/zl/mjga/dto/ai/LlmUpdateDto.java deleted file mode 100644 index 66c47ac..0000000 --- a/backend/src/main/java/com/zl/mjga/dto/ai/LlmUpdateDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.zl.mjga.dto.ai; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Data -public class LlmUpdateDto { - @NotNull private Long id; - @NotEmpty private String name; - @NotEmpty private String modelName; - @NotEmpty private String apiKey; - @NotEmpty private String url; - @NotNull private Boolean enable; - @NotNull private Short priority; -} diff --git a/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java b/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java new file mode 100644 index 0000000..a188528 --- /dev/null +++ b/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java @@ -0,0 +1,22 @@ +package com.zl.mjga.dto.ai; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class LlmVm { + @NotNull private Long id; + + @NotEmpty(message = "名称不能为空") private String name; + + @NotEmpty(message = "模型名称不能为空") private String modelName; + + @NotEmpty(message = "apikey 不能为空") private String apiKey; + + @NotEmpty(message = "url 不能为空") private String url; + + @NotNull(message = "是否启用不能为空") private Boolean enable; + + @NotNull(message = "优先级不能为空") private Short priority; +} diff --git a/backend/src/main/java/com/zl/mjga/model/urp/EPermission.java b/backend/src/main/java/com/zl/mjga/model/urp/EPermission.java index ebf0fc9..7a88b88 100644 --- a/backend/src/main/java/com/zl/mjga/model/urp/EPermission.java +++ b/backend/src/main/java/com/zl/mjga/model/urp/EPermission.java @@ -9,5 +9,7 @@ public enum EPermission { WRITE_SCHEDULER_PERMISSION, WRITE_USER_ROLE_PERMISSION, DELETE_USER_ROLE_PERMISSION, - READ_USER_ROLE_PERMISSION + READ_USER_ROLE_PERMISSION, + READ_LLM_CONFIG_PERMISSION, + WRITE_LLM_CONFIG_PERMISSION, } diff --git a/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java b/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java new file mode 100644 index 0000000..74db706 --- /dev/null +++ b/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java @@ -0,0 +1,32 @@ +package com.zl.mjga.repository; + +import static org.jooq.generated.mjga.Tables.AI_LLM_CONFIG; + +import com.zl.mjga.dto.PageRequestDto; +import org.jooq.Configuration; +import org.jooq.Record; +import org.jooq.Result; +import org.jooq.generated.mjga.tables.daos.AiLlmConfigDao; +import org.jooq.impl.DSL; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class LlmRepository extends AiLlmConfigDao { + + @Autowired + public LlmRepository(Configuration configuration) { + super(configuration); + } + + public Result pageFetchBy(PageRequestDto pageRequestDto) { + return ctx() + .select( + AI_LLM_CONFIG.asterisk(), DSL.count().over().as("total_llm").convertFrom(Long::valueOf)) + .from(AI_LLM_CONFIG) + .orderBy(pageRequestDto.getSortFields()) + .limit(pageRequestDto.getSize()) + .offset(pageRequestDto.getOffset()) + .fetch(); + } +} diff --git a/backend/src/main/java/com/zl/mjga/service/LlmService.java b/backend/src/main/java/com/zl/mjga/service/LlmService.java index b730efd..34d4bee 100644 --- a/backend/src/main/java/com/zl/mjga/service/LlmService.java +++ b/backend/src/main/java/com/zl/mjga/service/LlmService.java @@ -1,13 +1,16 @@ package com.zl.mjga.service; -import com.zl.mjga.dto.ai.LlmUpdateDto; +import com.zl.mjga.dto.PageRequestDto; +import com.zl.mjga.dto.PageResponseDto; +import com.zl.mjga.dto.ai.LlmVm; +import com.zl.mjga.repository.LlmRepository; import java.util.List; import java.util.Objects; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jooq.Record; +import org.jooq.Result; import org.jooq.generated.default_schema.enums.LlmCodeEnum; -import org.jooq.generated.mjga.tables.daos.AiLlmConfigDao; import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -17,25 +20,35 @@ import org.springframework.stereotype.Service; @Slf4j public class LlmService { - private final AiLlmConfigDao aiLlmConfigDao; + private final LlmRepository llmRepository; public AiLlmConfig loadConfig(LlmCodeEnum llmCodeEnum) { - return aiLlmConfigDao.fetchOneByCode(llmCodeEnum); + return llmRepository.fetchOneByCode(llmCodeEnum); } public AiLlmConfig getPrecedenceLlmBy(Boolean enable) { - List aiLlmConfigs = aiLlmConfigDao.fetchByEnable(enable); + List aiLlmConfigs = llmRepository.fetchByEnable(enable); //noinspection OptionalGetWithoutIsPresent return aiLlmConfigs.stream() .max((o1, o2) -> o2.getPriority().compareTo(o1.getPriority())) .get(); } - public void update(LlmUpdateDto llmUpdateDto) { + public PageResponseDto> pageQueryLlm(PageRequestDto pageRequestDto) { + Result records = llmRepository.pageFetchBy(pageRequestDto); + if (records.isEmpty()) { + return PageResponseDto.empty(); + } + List llmVms = records.into(LlmVm.class); + Long totalLlm = records.get(0).getValue("total_llm", Long.class); + return new PageResponseDto<>(totalLlm, llmVms); + } + + public void update(LlmVm llmVm) { AiLlmConfig aiLlmConfig = new AiLlmConfig(); - BeanUtils.copyProperties(llmUpdateDto, aiLlmConfig); - AiLlmConfig byId = aiLlmConfigDao.findById(llmUpdateDto.getId()); + BeanUtils.copyProperties(llmVm, aiLlmConfig); + AiLlmConfig byId = llmRepository.findById(llmVm.getId()); aiLlmConfig.setCode(Objects.requireNonNull(byId).getCode()); - aiLlmConfigDao.merge(aiLlmConfig); + llmRepository.merge(aiLlmConfig); } }