From 4960a73b581b570bd4b3aee358aaa0a8c8c0611d Mon Sep 17 00:00:00 2001
From: TangCheng <tangchengmail@163.com>
Date: 星期日, 02 三月 2025 15:59:50 +0800
Subject: [PATCH] 完成attach table的加载

---
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerEncache.java     |   25 ++
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAIAttachTableDef.java  |  103 +++++++++++
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAttachTableSqlXml.java |  179 +++++++++++++++++++
 JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json                                 |   27 ++
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java    |   85 ++++++++-
 JAVA/SMTAIServer/src/main/resources/application.yml                                         |    4 
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerApp.java         |   19 ++
 JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerRequest.java     |   62 ++++++
 8 files changed, 489 insertions(+), 15 deletions(-)

diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAIAttachTableDef.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAIAttachTableDef.java
new file mode 100644
index 0000000..1bda94e
--- /dev/null
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAIAttachTableDef.java
@@ -0,0 +1,103 @@
+package com.smtaiserver.smtaiserver.attach;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.Node;
+
+import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
+import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
+import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap;
+import com.smtservlet.util.Json;
+import com.smtservlet.util.SMTJsonWriter;
+import com.smtservlet.util.SMTStatic;
+
+public class SMTAIAttachTableDef 
+{
+	public static class SMTAIAttachTableColumn
+	{
+		private String				_name;
+		private String				_title;
+		private char				_type;
+		private String				_filter;
+		
+		public SMTAIAttachTableColumn(Element xmlColumn) throws Exception
+		{
+			_name = SMTStatic.getXmlAttr(xmlColumn, "name");
+			_title = SMTStatic.getXmlAttr(xmlColumn, "title");
+			_type = SMTStatic.getXmlAttr(xmlColumn, "type").charAt(0);
+			_filter = SMTStatic.getXmlAttr(xmlColumn, "filter", null);
+		}
+		
+		public String getName()
+		{
+			return _name;
+		}
+		
+		public String getTitle()
+		{
+			return _title;
+		}
+		
+		public char getType()
+		{
+			return _type;
+		}
+		
+		public String getFilter()
+		{
+			return _filter;
+		}
+	}
+	
+	private String							_id;
+	private String							_title;
+	private String							_group;
+	private SMTAttachTableSqlXml			_sqlXml;
+	private List<SMTAIAttachTableColumn>	_listColumns = new ArrayList<>();
+	
+	public SMTAIAttachTableDef(DBRecord rec) throws Exception
+	{
+		_id = rec.getString("table_id");
+		_title = rec.getString("table_title");
+		_group = rec.getString("table_group");
+		Document doc = SMTStatic.convStrToXmlDoc("<ROOT>" + rec.getString("table_config") + "</ROOT>");
+		Element xmlSQL = (Element)doc.selectSingleNode("ROOT/SQL");
+		_sqlXml = new SMTAttachTableSqlXml(xmlSQL);
+		for(Node nodeColumn : doc.selectNodes("ROOT/COLUMNS/COLUMN"))
+		{
+			SMTAIAttachTableColumn column = new SMTAIAttachTableColumn((Element)nodeColumn);
+			_listColumns.add(column);
+		}
+	}
+	
+	public List<SMTAIAttachTableColumn> getColumnList()
+	{
+		return _listColumns;
+	}
+	
+	public String getId()
+	{
+		return _id;
+	}
+	
+	public String getTitle()
+	{
+		return _title;
+	}
+	
+	public String getGroup()
+	{
+		return _group;
+	}	
+	
+	public void queryRecordsToJson(Json jsonFilter, Json jsonOrder, SMTJsonWriter jsonWr) throws Exception
+	{
+		try(ASTDBMap dbMap = new ASTDBMap())
+		{
+			_sqlXml.querySQLToJson(dbMap, jsonFilter, jsonOrder, this, jsonWr);
+		}
+	}
+}
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAttachTableSqlXml.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAttachTableSqlXml.java
new file mode 100644
index 0000000..63b9c41
--- /dev/null
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/attach/SMTAttachTableSqlXml.java
@@ -0,0 +1,179 @@
+package com.smtaiserver.smtaiserver.attach;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.tree.DefaultText;
+
+import com.smtaiserver.smtaiserver.attach.SMTAIAttachTableDef.SMTAIAttachTableColumn;
+import com.smtaiserver.smtaiserver.database.SMTDatabase;
+import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
+import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecords;
+import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap;
+import com.smtservlet.util.Json;
+import com.smtservlet.util.SMTJsonWriter;
+import com.smtservlet.util.SMTStatic;
+
+
+
+public class SMTAttachTableSqlXml 
+{
+	///////////////////////////////////////////////////////////////////////////////////////
+	private static class SQLXMLExecArg
+	{
+		public StringBuilder		_sbSQLText = new StringBuilder();
+		public List<Object>			_sqlParams = new ArrayList<>();
+		
+	}
+	
+	///////////////////////////////////////////////////////////////////////////////////////
+	private static abstract class SQLXMLNode
+	{
+		public abstract void execute(SQLXMLExecArg execArg) throws Exception;
+	}
+	
+	
+	///////////////////////////////////////////////////////////////////////////////////////
+	private static class SQLXMLNodeSQL extends SQLXMLNode
+	{
+		private List<Object>	_listChildren = new ArrayList<>();
+		
+		public SQLXMLNodeSQL(Element xmlRoot) throws Exception
+		{
+			for (Iterator<Node> iterInner = xmlRoot.nodeIterator(); iterInner.hasNext();)
+			{			
+				Node nodeInner = iterInner.next();
+				if(nodeInner.getNodeType() == Node.TEXT_NODE)
+				{
+					String text = ((DefaultText)nodeInner).getText();
+					int lastPos = _listChildren.size() - 1;
+					if(lastPos >= 0 && _listChildren.get(lastPos) instanceof String)
+					{
+						_listChildren.set(lastPos, (String)_listChildren.get(lastPos) + text);
+					}
+					else
+					{
+						_listChildren.add(text);
+					}
+				}	
+				else
+				{
+					_listChildren.add(createSQLXMLNode((Element)nodeInner));
+				}
+			}
+		}
+
+		@Override
+		public void execute(SQLXMLExecArg execArg) throws Exception
+		{
+			for(Object oxmlNode : _listChildren)
+			{
+				if(oxmlNode instanceof String)
+				{
+					execArg._sbSQLText.append(oxmlNode);
+				}
+				else if(oxmlNode instanceof SQLXMLNode)
+				{
+					((SQLXMLNode)oxmlNode).execute(execArg);
+				}
+			}
+		}
+	}
+
+
+	///////////////////////////////////////////////////////////////////////////////////////
+	private String					_dsId;
+	private SQLXMLNode				_SQLXMLNode;
+	
+	private static SQLXMLNode createSQLXMLNode(Element xmlRoot) throws Exception
+	{
+		String name = xmlRoot.getName().toUpperCase();
+		if("SQL".equals(name))
+			return new SQLXMLNodeSQL(xmlRoot);
+		else
+			throw new Exception("unknow SQLXML : " + name);
+	}
+
+	public SMTAttachTableSqlXml(Element rootElement) throws Exception
+	{
+		_dsId = SMTStatic.getXmlAttr(rootElement, "ds_id", null);
+		
+		_SQLXMLNode = createSQLXMLNode(rootElement);
+	}
+
+	public void querySQLToJson(ASTDBMap dbMap, Json jsonFilters, Json jsonOrders, SMTAIAttachTableDef attachTableDef, SMTJsonWriter jsonWr) throws Exception 
+	{
+		// 鐢熸垚鍘熷SQL
+		SQLXMLExecArg execArg = new SQLXMLExecArg();
+		_SQLXMLNode.execute(execArg);
+		
+		// 鐢熸垚鏉′欢鏌ヨ
+		StringBuilder sbWHERE = new StringBuilder();
+		if(jsonFilters != null)
+		{
+			for(Json jsonFilter : jsonFilters.asJsonList())
+			{
+				if(sbWHERE.length() > 0)
+					sbWHERE.append(" AND ");
+				
+				String column = jsonFilter.getJson("col").asString();
+				String filter = jsonFilter.getJson("filter").asString();
+				List<Json> values = jsonFilter.getJson("values").asJsonList();
+			
+				if("like".equals(filter))
+				{
+					sbWHERE.append(column + " LIKE '" + values.get(0).asString().replace("'", "''") + "'");
+				}
+				else
+					throw new Exception("can't find filter op : " + filter);
+			}
+		}
+		if(sbWHERE.length() > 0)
+			sbWHERE.insert(0, " WHERE ");
+		
+		// 鐢熸垚鎺掑簭鏉′欢
+		StringBuilder sbORDER = new StringBuilder();
+		if(jsonOrders != null)
+		{
+			for(Json jsonOrder : jsonOrders.asJsonList())
+			{
+				if(sbORDER.length() > 0)
+					sbORDER.append(",");
+				String colName = jsonOrder.getJson("col").asString();
+				String order = jsonOrder.safeGetStr("order", "ASC");
+				
+				sbORDER.append(colName + " " + order);
+			}
+		}
+		if(sbORDER.length() > 0)
+			sbORDER.insert(0, " ORDER BY ");
+		
+		
+		SMTDatabase db = dbMap.getDatabase(_dsId);
+		DBRecords recs = db.querySQL(
+			"SELECT * FROM (" + execArg._sbSQLText.toString() + ") T " + sbWHERE.toString() + " " + sbORDER.toString() + " LIMIT 100", 
+			execArg._sqlParams.size() == 0 ? null : execArg._sqlParams.toArray(new Object[] {execArg._sqlParams.size()})
+		);
+		
+		jsonWr.beginArray("columns");
+		for(SMTAIAttachTableColumn column : attachTableDef.getColumnList())
+		{
+			jsonWr.addKeyValue(null, column.getTitle());
+		}
+		jsonWr.endArray();
+		
+		jsonWr.beginArray("values");
+		for(DBRecord rec : recs.getRecords())
+		{
+			jsonWr.beginArray(null);
+			for(SMTAIAttachTableColumn column : attachTableDef.getColumnList())
+			{
+				jsonWr.addKeyValue(null, rec.getString(column.getName()));
+			}			
+			jsonWr.endArray();
+		}
+		jsonWr.endArray();
+	}
+}
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java
index 4fa8943..f17f411 100644
--- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java
@@ -19,6 +19,8 @@
 import org.springframework.web.servlet.View;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
+import com.smtaiserver.smtaiserver.attach.SMTAIAttachTableDef;
+import com.smtaiserver.smtaiserver.attach.SMTAIAttachTableDef.SMTAIAttachTableColumn;
 import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
 import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
 import com.smtaiserver.smtaiserver.core.SMTAIServerRequest.AIAttachFile;
@@ -115,6 +117,13 @@
 					}
 				}
 				
+				_mustRawMode = true;
+			}
+			
+			Json jsonTables = tranReq.convParamToJson("tables", false);
+			if(jsonTables != null)
+			{
+				tranReq.setAttachTables(jsonTables);
 				_mustRawMode = true;
 			}
 			
@@ -339,27 +348,38 @@
 	    	String sampleId = tranReq.convParamToString("sample_id", false);
 	    	String llmId = tranReq.convParamToString("llm_id", false);
 	    	String historyGroupId = tranReq.convParamToString("history_group_id", true);
-	    	String question = tranReq.convParamToString("question", true);
+	    	String question = java.net.URLDecoder.decode(tranReq.convParamToString("question", true), "UTF-8");
 	    	String processId = tranReq.convParamToString("process_id", false);
-	    	Boolean rawMode = tranReq.convParamToBoolean("raw_mode", false);
+	    	String sRawMode = tranReq.convParamToString("raw_mode", false);
 	    	String prevQuestion = tranReq.convParamToString("prev_question", false);
 	    	String groupType = tranReq.convParamToString("group_type", false);
 	    	double[] curPos = tranReq.convParamToDoubleArray("cur_pos", false);
 	
 	    	if(SMTStatic.isNullOrEmpty(groupType))
 	    		groupType = "涓氬姟鍦烘櫙";
+	    	else
+	    		groupType = java.net.URLDecoder.decode(groupType, "UTF-8");
 	    	
 	    	tranReq.setCurQuestionPos(curPos);
 	    	tranReq.setCurGroupType(groupType);
 	    	
 	    	question = SMTAIServerApp.getApp().getQueryAIQuestionReplace().replaceQuestion(groupType, question);
 	    	
+	    	boolean rawMode = false;
 	    	
-	    	if(rawMode == null)
-	    		rawMode = false;
-	    	
-	    	if(mustRawMode)
-	    		rawMode = true;
+	    	if(sRawMode != null)
+	    	{
+	    		if("AI".equals(sRawMode))
+	    		{
+	    			rawMode = false;
+	    		}
+	    		else
+	    		{
+	    			rawMode = "true".equals(sRawMode);
+	    	    	if(mustRawMode)
+	    	    		rawMode = true;	    			
+	    		}
+	    	}
 	    	
 	   		tranReq.setAsynProcessId(processId);
 	   		Json jsonResult = null;
@@ -462,11 +482,11 @@
 				Json jsonSqlParams = null;
 				if(jsonResult != null)
 				{
-
-					
-					
 					jsonResult.set("question", tranReq.getAIQuestion());
 					jsonResult.set("history_id", historyId);
+					tranReq.addAttachMessageToJson(jsonResult);
+					
+					
 					jsonSqlParams = tranReq.getParamJson();
 					
 					Json jsonExtCallList = tranReq.getExtCallJsonWriter();
@@ -1179,4 +1199,49 @@
     	return tranReq.returnJson(jsonWr);
     }
 
+    public ModelAndView getAttachTableList(SMTAIServerRequest tranReq) throws Exception 
+    {
+    	SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
+    	jsonWr.beginArray("tables");
+    	for(SMTAIAttachTableDef attachTableDef : SMTAIServerApp.getApp().getAttachTableDefMap().values())
+    	{
+    		jsonWr.beginMap(null);
+    		{
+    			jsonWr.addKeyValue("id", attachTableDef.getId());
+    			jsonWr.addKeyValue("title", attachTableDef.getTitle());
+    			jsonWr.addKeyValue("group", attachTableDef.getGroup());
+    			
+    			jsonWr.beginArray("columns");
+    			for(SMTAIAttachTableColumn columnDef : attachTableDef.getColumnList())
+    			{
+    				jsonWr.beginMap(null);
+    				{
+    					jsonWr.addKeyValue("name", columnDef.getName());
+    					jsonWr.addKeyValue("title", columnDef.getTitle());
+    					jsonWr.addKeyValue("filter", columnDef.getFilter());
+    				}
+    				jsonWr.endMap();
+    			}
+    			jsonWr.endArray();
+    		}
+    		jsonWr.endMap();
+    	}
+    	jsonWr.endArray();
+    	
+    	return tranReq.returnJson(jsonWr);
+    }
+    
+    public ModelAndView queryAttachTableRecords(SMTAIServerRequest tranReq) throws Exception 
+    {
+    	String attachTableId = tranReq.convParamToString("id", true);
+    	Json jsonFilters = tranReq.convParamToJson("filter", false);
+    	Json jsonOrders = tranReq.convParamToJson("order", false);
+    	SMTAIAttachTableDef attachTableDef = (SMTAIAttachTableDef) SMTAIServerApp.getApp().getAttachTableDef(attachTableId);
+    	
+    	SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
+    	attachTableDef.queryRecordsToJson(jsonFilters, jsonOrders, jsonWr);
+    	
+    	return tranReq.returnJson(jsonWr);
+    	
+    }
 }
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerApp.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerApp.java
index 19ed742..31c0566 100644
--- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerApp.java
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerApp.java
@@ -36,6 +36,7 @@
 import org.springframework.web.context.WebApplicationContext;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import com.smtaiserver.smtaiserver.attach.SMTAIAttachTableDef;
 import com.smtaiserver.smtaiserver.database.SMTDatabase;
 import com.smtaiserver.smtaiserver.gismap.SMTGisMapLayerDef;
 import com.smtaiserver.smtaiserver.gismap.SMTMapOtypeDef;
@@ -158,7 +159,8 @@
 		"getMapTableDefMap",
 		"getMapVPropDefMap",
 		"getMapThemeTableDefMap",
-		"getMapThemeDefMap"
+		"getMapThemeDefMap",
+		"getAttachTableDefMap"
 	};
 
 	public static SMTAIServerApp getApp()
@@ -290,6 +292,7 @@
 		_serverEncache.getMapVPropDefMap();
 		_serverEncache.getMapThemeTableDefMap();
 		_serverEncache.getMapThemeDefMap();
+		_serverEncache.getAttachTableDefMap();
 	}
 	
 	public SMTMapTableDef getMapTableDef(String tableId) throws Exception
@@ -1204,4 +1207,18 @@
 		
 		return themeDef;
 	}
+	
+	public Map<String, SMTAIAttachTableDef> getAttachTableDefMap() throws Exception
+	{
+		return _serverEncache.getAttachTableDefMap();
+	}
+	
+	public SMTAIAttachTableDef getAttachTableDef(String id) throws Exception
+	{
+		SMTAIAttachTableDef attachTableDef = _serverEncache.getAttachTableDefMap().get(id);
+		if(attachTableDef == null)
+			throw new Exception("can't find attach table define : " + id);
+		
+		return attachTableDef;
+	}
 }
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerEncache.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerEncache.java
index 1fd46b8..022f276 100644
--- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerEncache.java
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerEncache.java
@@ -11,6 +11,7 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.annotation.Cacheable;
 
+import com.smtaiserver.smtaiserver.attach.SMTAIAttachTableDef;
 import com.smtaiserver.smtaiserver.database.SMTDatabase;
 import com.smtaiserver.smtaiserver.database.SMTDatabase.DBQueryNotify;
 import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
@@ -582,4 +583,28 @@
 		}
 		return mapResult;			
 	}
+	
+	@Cacheable(value="getAttachTableDefMap")
+	public Map<String, SMTAIAttachTableDef> getAttachTableDefMap() throws Exception
+	{
+		Map<String, SMTAIAttachTableDef> mapResult = new HashMap<>();
+		SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
+		try
+		{
+			DBRecords recs;
+			
+			recs = db.querySQL("SELECT * FROM ai_attach_table", null);
+			for(DBRecord rec : recs.getRecords())
+			{
+				SMTAIAttachTableDef attachTableDef = new SMTAIAttachTableDef(rec);
+				mapResult.put(attachTableDef.getId(), attachTableDef);
+			}
+
+		}
+		finally
+		{
+			db.close();
+		}
+		return mapResult;			
+	}
 }
diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerRequest.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerRequest.java
index ac82633..34079e3 100644
--- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerRequest.java
+++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/core/SMTAIServerRequest.java
@@ -50,6 +50,12 @@
 		{
 			return "闄勫姞鏂囦欢 : " + _fileName + "\n" + _fileText + "\n";
 		}
+		
+		public void addToJson(SMTJsonWriter jsonWr)
+		{
+			jsonWr.addKeyValue("file_id", _fileId);
+			jsonWr.addKeyValue("file_name", _fileName);
+		}
 	}
 	
 	private static Logger 			_logger = LogManager.getLogger(SMTAIServerRequest.class);
@@ -89,6 +95,7 @@
 	private List<SMTJsonWriter>		_listJsonWrResult = null;
 	private boolean					_disableConclusion = false;
 	private List<AIAttachFile>		_listAttchFile = null;
+	private Json					_jsonAttachTables = null;
 
 
 	@Override
@@ -114,6 +121,11 @@
 		}
 	}
 	
+	public void setAttachTables(Json jsonTables)
+	{
+		_jsonAttachTables = jsonTables;
+	}
+	
 	public String[] getAttachMessage()
 	{
 		List<String> list = new ArrayList<>();
@@ -126,9 +138,59 @@
 			}
 		}
 		
+		if(_jsonAttachTables != null)
+		{
+			for(Json jsonAttachTable : _jsonAttachTables.asJsonList())
+			{
+				StringBuilder sbText = new StringBuilder();
+				sbText.append("鐜版湁琛ㄦ牸锛�" + jsonAttachTable.getJson("title").asString() + "\n");
+				List<Json> jsonColumns = jsonAttachTable.getJson("columns").asJsonList();
+				for(int i = 0; i < jsonColumns.size(); i ++)
+				{
+					if(i > 0)
+						sbText.append(",");
+					sbText.append(jsonColumns.get(i).asString());
+				}
+				sbText.append("\n");
+				for(Json jsonRecord : jsonAttachTable.getJson("values").asJsonList())
+				{
+					List<Json> listRec = jsonRecord.asJsonList();
+					for(int i = 0; i < listRec.size(); i ++)
+					{
+						if(i > 0)
+							sbText.append(",");
+						sbText.append(listRec.get(i).asString());						
+					}
+				}
+				sbText.append("\n");
+				list.add(sbText.toString());
+			}
+		}
+		
 		return list.size() == 0 ? null : list.toArray(new String[list.size()]);
 	}
 	
+	public void addAttachMessageToJson(Json jsonResult)
+	{
+		if(_listAttchFile != null)
+		{
+			SMTJsonWriter jsonWr = new SMTJsonWriter(true);
+			for(AIAttachFile file : _listAttchFile)
+			{
+				jsonWr.beginMap(null);
+				file.addToJson(jsonWr);
+				jsonWr.endMap();
+			}
+			
+			jsonResult.set("attach_files", jsonWr.getRootJson());
+		}
+		
+		if(_jsonAttachTables != null)
+		{
+			jsonResult.set("attach_tables", _jsonAttachTables);
+		}
+	}
+	
 	public void addAttachFile(AIAttachFile attachFile)
 	{
 		if(_listAttchFile == null)
diff --git a/JAVA/SMTAIServer/src/main/resources/application.yml b/JAVA/SMTAIServer/src/main/resources/application.yml
index 9d41400..7811fc6 100644
--- a/JAVA/SMTAIServer/src/main/resources/application.yml
+++ b/JAVA/SMTAIServer/src/main/resources/application.yml
@@ -33,9 +33,9 @@
     # 杩炴帴姹犻厤缃�
     druid:
       # 鍒濆鍖栧ぇ灏忥紝鏈�灏忥紝鏈�澶�
-      initial-size: 10
+      initial-size: 0
       min-idle: 10
-      max-active: 200
+      max-active: 1024
       # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
       max-wait: 60000
       # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆绉�
diff --git a/JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json b/JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json
index 2f4ccf3..9affdcf 100644
--- a/JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json
+++ b/JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json
@@ -165,8 +165,8 @@
 					{"name":"prev_question", "title":"涓婃瀵硅瘽鍐呭", "required":false},
 					{"name":"group_type", "title":"闂鍒嗙被", "default":"涓氬姟鍦烘櫙", "required":false},
 					{"name":"cur_pos", "title":"褰撳墠浣嶇疆", "required":false},
-					{"name":"files", "title":"闄勪欢鏂囦欢", "required":false, "type":"file"}
-
+					{"name":"files", "title":"闄勪欢鏂囦欢", "required":false, "type":"file"},
+					{"name":"tables", "title":"闄勪欢琛ㄨ褰昜{title:涓枃鍚�, columns:[瀛楁1锛屽瓧娈�2...],values:[[鍊�1锛屽��2...]]}]", "required":false}
 				]
 			}
 		]
@@ -285,5 +285,28 @@
 				]
 			}
 		]
+	},
+	
+	"attach/get_attach_table_list":{"map":{"class":"#SMTJavaAIControl", "method":"getAttachTableList"},
+			"swaggers":[
+			{	"tags" : ["闄勪欢鎿嶄綔"],
+				"title" : "鑾峰彇闄勪欢琛ㄥ畾涔夊垪琛�",
+				"parameters" : [
+				]
+			}
+		]
+	},
+	
+	"attach/query_attach_table_records":{"map":{"class":"#SMTJavaAIControl", "method":"queryAttachTableRecords"},
+			"swaggers":[
+			{	"tags" : ["闄勪欢鎿嶄綔"],
+				"title" : "鏌ヨ闄勪欢琛ㄨ褰�",
+				"parameters" : [
+					{"name":"id", "title":"鏌ヨ琛╥d", "required":true},
+					{"name":"filter", "title":"杩囨护鏉′欢[{col:瀛楁鍚�, filter:杩囨护鏉′欢, values:[鍊�1锛屽��2...]},...]", "required":false},
+					{"name":"order", "title":"鎺掑簭鏉′欢[{col:瀛楁鍚�, order:ASC/DESC", "required":false}
+				]
+			}
+		]
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.3