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