1
秦芳睿
2025-03-22 c5243f3521fc014b4e2649789d16ca1f3b7e849d
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerApp.java
@@ -1,7 +1,7 @@
package com.smtaiserver.smtaiserver.core;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.*;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
@@ -19,6 +19,12 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
@@ -36,6 +42,7 @@
import org.springframework.web.context.WebApplicationContext;
import com.alibaba.druid.pool.DruidDataSource;
import com.smtaiserver.smtaiserver.attach.SMTAIAttachMetricDef;
import com.smtaiserver.smtaiserver.attach.SMTAIAttachTableDef;
import com.smtaiserver.smtaiserver.database.SMTDatabase;
import com.smtaiserver.smtaiserver.gismap.SMTGisMapLayerDef;
@@ -66,6 +73,7 @@
import net.sf.ehcache.CacheManager;
import com.smtservlet.core.SMTApp.SMTEhCacheManagerInitialize;
import org.springframework.web.multipart.MultipartFile;
public class SMTAIServerApp extends SMTApp implements SMTEhCacheManagerInitialize,SMTApp.SMTSessionListenerEvent
@@ -138,7 +146,7 @@
   
   protected Map<String, SMTSSEBroadcastChat>   _mapUser2SMTSSEBroadcastChat = new HashMap<>();
   public static final String GET_WORKFLOWS = "http://localhost:5678/api/v1/workflows?";
   private static Pattern               _patGroupStep = Pattern.compile("(\\d+)\\s*(minutes|hours|days|months|years|month|hour|year|day|minute)");
   private static Pattern               _patGlobalMacro = Pattern.compile("\\{\\{\\{([\\w\\.]+)\\}\\}\\}");
   private static Logger                _logger = LogManager.getLogger(SMTQwenApp.class);
@@ -160,7 +168,8 @@
      "getMapVPropDefMap",
      "getMapThemeTableDefMap",
      "getMapThemeDefMap",
      "getAttachTableDefMap"
      "getAttachTableDefMap",
      "getAttachMetricDefMap"
   };
   public static SMTAIServerApp getApp()
@@ -227,7 +236,7 @@
      Map<String, SMTMetricsDef> mapResult = mapMapMetrics.get(groupId);
      
      if(mapResult == null)
         throw new Exception("can't find metrics group : " + groupId);
         return new HashMap<String, SMTMetricsDef>();
      
      return mapResult;
   }
@@ -293,6 +302,8 @@
      _serverEncache.getMapThemeTableDefMap();
      _serverEncache.getMapThemeDefMap();
      _serverEncache.getAttachTableDefMap();
      _serverEncache.getAttachMetricDefMap();
      _serverEncache.getQwenAgentManager();
   }
   
   public SMTMapTableDef getMapTableDef(String tableId) throws Exception
@@ -1221,4 +1232,113 @@
      
      return attachTableDef;
   }
   public Map<String, SMTAIAttachMetricDef> getAttachMetricDefMap() throws Exception
   {
      return _serverEncache.getAttachMetricDefMap();
   }
   public SMTAIAttachMetricDef getAttachMetricDef(String id) throws Exception
   {
      SMTAIAttachMetricDef attachMetricDef = _serverEncache.getAttachMetricDefMap().get(id);
      if(attachMetricDef == null)
         throw new Exception("can't find attach metric def : " + id);
      return attachMetricDef;
   }
   /**
    * 文件(word、pdf)转txt
    */
   public static String fileTranslTxt(MultipartFile file) throws Exception {
      InputStream inputStream = file.getInputStream();
      try (BufferedInputStream bis = new BufferedInputStream(file.getInputStream())) {
         String mimeType = file.getContentType();
         if (mimeType != null) {
            switch (mimeType) {
               case "application/pdf":
                  _logger.info("文件类型是 PDF");
                  PDDocument document = PDDocument.load(inputStream);
                  PDFTextStripper stripper = new PDFTextStripper();
                        return stripper.getText(document);
               case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
                  _logger.info("文件类型是 Word (DOCX)");
                  try (XWPFDocument docx = new XWPFDocument(bis)) {
                     XWPFWordExtractor docxExtractor = new XWPFWordExtractor(docx);
                     return docxExtractor.getText();
                  }
               case "application/msword":
                  _logger.info("文件类型是 Word (DOC)");
                  try (HWPFDocument doc = new HWPFDocument(bis)) {
                     WordExtractor wordExtractor = new WordExtractor(doc);
                     return wordExtractor.getText();
                  }
               case "text/plain":
                  _logger.info("文件类型是 TXT");
                  byte[] fileData = readAttachFile(file);
                        return new String(fileData, "UTF-8");
               default:
                  _logger.info("未知文件类型: " + mimeType);
                  break;
            }
         } else {
            _logger.info("无法获取文件类型");
         }
      } catch (Exception e) {
         _logger.error("文件处理失败: " + e.getMessage());
         throw new Exception("文件处理失败: " + e.getMessage());
      }
      return "";
   }
   public static byte[] readAttachFile(MultipartFile file) throws Exception
   {
      InputStream is = file.getInputStream();
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      byte[] data = new byte[1024 * 1024];
      while(true)
      {
         int size = is.read(data);
         if(size <= 0)
            return bos.toByteArray();
         bos.write(data, 0, size);
      }
   }
   public static String buildUrl(String active, String tags, String name, String projectId, String excludePinnedData, int limit) throws UnsupportedEncodingException {
      // 使用Map来存储参数
      Map<String, String> params = new HashMap<>();
      params.put("active", active);
      params.put("tags", tags);
      params.put("name", name != null ? URLEncoder.encode(name, "UTF-8") : null);
      params.put("projectId", projectId);
      params.put("excludePinnedData", excludePinnedData);
      params.put("limit", String.valueOf(limit));
      // 基本URL
      StringBuilder urlBuilder = new StringBuilder(GET_WORKFLOWS);
      // 遍历map并构建URL
      for (Map.Entry<String, String> entry : params.entrySet()) {
         if (entry.getValue() != null) {
            urlBuilder.append(entry.getKey())
                  .append("=")
                  .append(entry.getValue())
                  .append("&");
         }
      }
      // 去除最后一个多余的&符号
      String requestUrl = urlBuilder.toString();
      if (requestUrl.endsWith("&")) {
         requestUrl = requestUrl.substring(0, requestUrl.length() - 1);
      }
      return requestUrl;
   }
   public static List<String> extractParts(String input, Pattern pattern) {
      Matcher matcher = pattern.matcher(input);
      List<String> results = new ArrayList<>();
      while (matcher.find()) {
         results.add(matcher.group(1)); // 提取第一个捕获组内容
      }
      return results;
   }
}