From 14bff9c21f86ebced8436fa0d92ed20a1f8384aa Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 05 Sep 2025 13:59:34 +0800
Subject: [PATCH] feat(ai): 添加 AI 生产题目功能
---
src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java | 72 ++++++++++++++++++++++++++++++++++++
src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java | 3 +
src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java | 9 ++++
src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java | 8 ++++
src/main/java/cc/mrbird/febs/ai/req/AiProductQuestionAiDto.java | 18 +++++++++
src/main/java/cc/mrbird/febs/ai/service/AiService.java | 8 ++++
6 files changed, 118 insertions(+), 0 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java b/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java
index ca3cb00..faa94f0 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productQuestion/AiProductQuestionController.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.ai.entity.AiProductPoint;
import cc.mrbird.febs.ai.entity.AiProductQuestion;
+import cc.mrbird.febs.ai.req.AiProductQuestionAiDto;
import cc.mrbird.febs.ai.service.AiProductQuestionService;
import cc.mrbird.febs.common.annotation.ControllerEndpoint;
import cc.mrbird.febs.common.controller.BaseController;
@@ -68,6 +69,13 @@
return aiProductQuestionService.delete(id);
}
+ @PostMapping("aiCreate/{id}")
+ @ControllerEndpoint(operation = "AI生成题目", exceptionMessage = "操作失败")
+ public FebsResponse aiCreate(@RequestBody @Valid AiProductQuestionAiDto dto) {
+
+ return aiProductQuestionService.aiCreate(dto);
+ }
+
@GetMapping(value = "/questionTree")
public FebsResponse questionTree() {
diff --git a/src/main/java/cc/mrbird/febs/ai/req/AiProductQuestionAiDto.java b/src/main/java/cc/mrbird/febs/ai/req/AiProductQuestionAiDto.java
new file mode 100644
index 0000000..e6114cd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/AiProductQuestionAiDto.java
@@ -0,0 +1,18 @@
+package cc.mrbird.febs.ai.req;
+
+import lombok.Data;
+
+@Data
+public class AiProductQuestionAiDto {
+
+ private String productCategoryId;
+
+ private String query;
+
+ private String promptAiSystem;
+
+ private String jsonFormat;
+
+ private Integer questionCnt;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
index 203750c..f7a4517 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
@@ -2,6 +2,7 @@
import cc.mrbird.febs.ai.entity.AiProductQuestion;
import cc.mrbird.febs.ai.entity.AiProductRole;
+import cc.mrbird.febs.ai.req.AiProductQuestionAiDto;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -37,4 +38,6 @@
List<AiProductQuestion> questionTree();
List<AiProductQuestion> productQuestionTree(LambdaQueryWrapper<AiProductQuestion> aiProductQuestionLambdaQueryWrapper);
+
+ FebsResponse aiCreate(AiProductQuestionAiDto dto);
}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiService.java b/src/main/java/cc/mrbird/febs/ai/service/AiService.java
new file mode 100644
index 0000000..a3fff1b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiService.java
@@ -0,0 +1,8 @@
+package cc.mrbird.febs.ai.service;
+
+import cc.mrbird.febs.ai.req.AiProductQuestionAiDto;
+
+public interface AiService {
+
+ String llmInvokeNonStreaming(AiProductQuestionAiDto dto);
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
index e8009fa..b33a42b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
@@ -2,8 +2,10 @@
import cc.mrbird.febs.ai.entity.*;
import cc.mrbird.febs.ai.mapper.AiProductQuestionMapper;
+import cc.mrbird.febs.ai.req.AiProductQuestionAiDto;
import cc.mrbird.febs.ai.service.AiProductQuestionItemService;
import cc.mrbird.febs.ai.service.AiProductQuestionService;
+import cc.mrbird.febs.ai.service.AiService;
import cc.mrbird.febs.ai.util.UUID;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
@@ -35,6 +37,7 @@
private final AiProductQuestionMapper aiProductQuestionMapper;
private final AiProductQuestionItemService aiProductQuestionItemService;
+ private final AiService aiService;
@Override
public AiProductQuestion getById(String id) {
@@ -162,4 +165,10 @@
return aiProductQuestionMapper.selectList(aiProductQuestionLambdaQueryWrapper);
}
+ @Override
+ public FebsResponse aiCreate(AiProductQuestionAiDto dto) {
+ String questionAndAnswerStr = aiService.llmInvokeNonStreaming(dto);
+ return null;
+ }
+
}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
new file mode 100644
index 0000000..f89d249
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
@@ -0,0 +1,72 @@
+package cc.mrbird.febs.ai.service.impl;
+
+import cc.mrbird.febs.ai.req.AiProductQuestionAiDto;
+import cc.mrbird.febs.ai.service.AiService;
+import cc.mrbird.febs.common.exception.FebsException;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AiServiceImpl implements AiService {
+
+ private static final String apiKey = "sk-babdcf8799144134915cee2683794b2f";
+ private static final String appId = "963b854d994a4f578d8207cd477a2464";
+
+ private final String bizParam_1 = "question";
+ private final String bizParam_2 = "prompt_ai_system";
+ private final String bizParam_3 = "json_format";
+
+ @Override
+ public String llmInvokeNonStreaming(AiProductQuestionAiDto dto) {
+ if (ObjectUtil.isNull(dto)){
+ throw new FebsException("百炼工作流初始化异常");
+ }
+
+ HashMap<String, Object> bizParams = new HashMap<>();
+ bizParams.put(bizParam_1,dto.getQuestionCnt());
+ bizParams.put(bizParam_2,dto.getPromptAiSystem());
+ bizParams.put(bizParam_3,dto.getJsonFormat());
+ String query = dto.getQuery();
+ long startTime = System.currentTimeMillis();
+// ApplicationParam param = ApplicationParam.builder()
+// // 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。
+// .apiKey(apiKey)
+// .appId(appId) //替换为实际的应用 ID
+// .flowStreamMode(FlowStreamMode.MESSAGE_FORMAT)
+// .prompt(query)
+// .bizParams(JsonUtils.toJsonObject( bizParams))
+// .build();
+//
+// Application application = new Application();
+// Flowable<ApplicationResult> result;
+// try {
+// result = application.streamCall(param);
+// } catch (NoApiKeyException | InputRequiredException e) {
+// throw new FebsException(StrUtil.format("百炼工作流输出失败:{}",e.getMessage()));
+// }
+//
+// return Flux.from(result)
+// .map(message -> {
+// HashMap<String, String> stringStringHashMap = new HashMap<>();
+// if (!message.getOutput().getFinishReason().equals("stop")){
+// stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),message.getOutput().getWorkflowMessage().getMessage().getContent());
+// }
+// return new FebsResponse().success().data(stringStringHashMap);
+// })
+// .doOnComplete(() -> {
+// long endTime = System.currentTimeMillis();
+// System.out.println("百炼工作流输出:" + (endTime - startTime) + "毫秒");
+// })
+// .doOnError(error -> {
+// throw new FebsException(StrUtil.format("百炼工作流输出失败:{}",error));
+// });
+ return null;
+ }
+}
--
Gitblit v1.9.1