TangCheng
2025-03-19 8d9902b30b3eea85c93156a84fed8c5ceee2f531
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java
@@ -3,16 +3,12 @@
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
@@ -96,10 +92,14 @@
               {
                  for(MultipartFile file : files)
                  {
                     String fileId = SMTStatic.newUUID();
                     String fileText="";
                     String fileSuffix = (String) SMTAIServerApp.getApp().getGlobalConfig("file_suffix", false);
                     String fileName = new File(file.getOriginalFilename()).getName();
                     byte[] fileData = readAttachFile(file);
                     String fileText = new String(fileData, "UTF-8");
                     if (fileSuffix.contains(fileName.substring(fileName.lastIndexOf(".") + 1))) {
                        fileText = SMTAIServerApp.fileTranslTxt(file);
                     }
                     String fileId = SMTStatic.newUUID();
                     db.executeSQL(
                          " INSERT INTO chat_history_attach(attach_id, attach_type, attach_title, attach_bytes)"
                        + " VALUES(?,?,?,?)", new Object[] {
@@ -127,7 +127,13 @@
            tranReq.setAttachTables(jsonTables);
            _mustRawMode = true;
         }
         Json jsonMetrics = tranReq.convParamToJson("metrics", false);
         if(jsonMetrics != null)
         {
            tranReq.setJsonAttachMetrics(jsonMetrics);
            _mustRawMode = true;
         }
         _tranReq = tranReq;
         _tranReq.setChunkedMode(true);
      }
@@ -349,7 +355,7 @@
          String sampleId = tranReq.convParamToString("sample_id", false);
          String llmId = tranReq.convParamToString("llm_id", false);
          String historyGroupId = tranReq.convParamToString("history_group_id", true);
          String question = java.net.URLDecoder.decode(tranReq.convParamToString("question", true), "UTF-8");
          String question = tranReq.convParamToString("question", true);
          String processId = tranReq.convParamToString("process_id", false);
          String sRawMode = tranReq.convParamToString("raw_mode", false);
          String prevQuestion = tranReq.convParamToString("prev_question", false);
@@ -358,8 +364,6 @@
   
          if(SMTStatic.isNullOrEmpty(groupType))
             groupType = "业务场景";
          else
             groupType = java.net.URLDecoder.decode(groupType, "UTF-8");
          
          tranReq.setCurQuestionPos(curPos);
          tranReq.setCurGroupType(groupType);
@@ -1239,10 +1243,12 @@
       String attachTableId = tranReq.convParamToString("id", true);
       Json jsonFilters = tranReq.convParamToJson("filter", false);
       Json jsonOrders = tranReq.convParamToJson("order", false);
       Integer limit = tranReq.convParamToInteger("limit", false);
       SMTAIAttachTableDef attachTableDef = (SMTAIAttachTableDef) SMTAIServerApp.getApp().getAttachTableDef(attachTableId);
       if (limit==null)
         limit=100;
       SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
       attachTableDef.queryRecordsToJson(jsonFilters, jsonOrders, jsonWr);
       attachTableDef.queryRecordsToJson(jsonFilters, jsonOrders, jsonWr,limit);
       
       return tranReq.returnJson(jsonWr);
       
@@ -1288,28 +1294,30 @@
       Date startTime = tranReq.convParamToDate("start_time", true);
          Date endTime = tranReq.convParamToDate("end_time", true);
       Json jsonQuotaKeys = tranReq.convParamToJson("quota_keys", true);
       Integer limit = tranReq.convParamToInteger("limit", false);
      if (limit==null)
         limit=100;
       SMTAIAttachMetricDef attachMetricDef = SMTAIServerApp.getApp().getAttachMetricDef(attachMetricId);
       
       SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
       attachMetricDef.queryValueToJson(startTime, endTime, jsonQuotaKeys, jsonWr);
       attachMetricDef.queryValueToJson(startTime, endTime, jsonQuotaKeys, jsonWr,limit);
       
       return tranReq.returnJson(jsonWr);
    }
    public ModelAndView callLLM(SMTAIServerRequest tranReq) throws Exception
    public ModelAndView callLLM(SMTAIServerRequest tranReq) throws Exception
    {
       String llmId = tranReq.convParamToString("llm_id", false);
       Json jsonSystems = tranReq.convParamToJson("system_json", false);
       String question = tranReq.convParamToString("question", true);
       boolean answerIsJson = tranReq.convParamToBoolean("answer_is_json", true);
       SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
       SMTLLMConnect conn = SMTAIServerApp.getApp().allocLLMConnect(llmId);
       List<String> listSystem = new ArrayList<>();
       if(jsonSystems != null)
       {
          for(Json jsonSystem : jsonSystems.asJsonList())
@@ -1317,7 +1325,7 @@
             listSystem.add(jsonSystem.asString());
          }
       }
       String answer = conn.callWithMessage(listSystem, question, tranReq);
       if(answerIsJson)
       {
@@ -1330,4 +1338,38 @@
      return tranReq.returnJson(jsonWr);
    }
   public ModelAndView downloadFileByFileId(SMTAIServerRequest tranReq, HttpServletResponse response) throws Exception {
      String fileId = tranReq.convParamToString("file_id", true);  // 获取请求中的file_id
      SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
      try {
         // 查询指定file_id的文件记录
         DBRecords dbRecords = db.querySQL("SELECT * FROM ai_times.chat_history_attach WHERE attach_id=?", new Object[]{fileId});
         if (dbRecords.getRecords().isEmpty()) {
            throw new Exception("文件不存在");
         }
         // 获取文件信息
         DBRecord fileRecord = dbRecords.getRecords().get(0);
         String attachTitle = fileRecord.getString("attach_title");  // 获取文件标题
         String extension = attachTitle.substring(attachTitle.lastIndexOf(".") + 1);
         // 扩展名和 MIME 类型映射
         Object fileTypeMapping = SMTAIServerApp.getApp().getGlobalConfig("file_type_mapping", false);
         Json json = Json.read(fileTypeMapping.toString());
         Map<String, Object> mimeTypes = json.asMap();
         String mimeType = (String) mimeTypes.getOrDefault(extension.toLowerCase(), "application/octet-stream");
         // 获取文件的字节数据,假设返回的是字节数组
         byte[] bytes = (byte[]) fileRecord.getValue("attach_bytes");  // 获取字节数据
         return tranReq.returnDownloadByteArray(bytes, attachTitle, mimeType);
//         // 设置响应头和文件名
//         String fileName = attachTitle != null ? attachTitle : "downloaded_file";
//         response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
//         response.setContentType("application/octet-stream");
//         response.getOutputStream().write(bytes);  // 写入字节数据
//         response.getOutputStream().flush();
      } catch (Exception e) {
         throw new Exception("Error processing file download: " + e.getMessage());
      }
   }
}