package com.smtaiserver.smtaiserver.javaai.jsonflow.node;
|
|
import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBQueryNotify;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
|
import com.smtaiserver.smtaiserver.gismap.SMTGisMapLayerDef;
|
import com.smtaiserver.smtaiserver.gismap.theme.SMTMapThemeDef;
|
import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowExecArg;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowManager;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowNodeOnlyOutput;
|
import com.smtaiserver.smtaiserver.javaai.jsonflow.core.SMTJsonFlowScriptJet;
|
import com.smtservlet.util.Json;
|
import com.smtservlet.util.SMTHttpClient;
|
import com.smtservlet.util.SMTJsonWriter;
|
import com.smtservlet.util.SMTStatic;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map.Entry;
|
import org.mozilla.javascript.Context;
|
import org.mozilla.javascript.Function;
|
import org.mozilla.javascript.NativeArray;
|
import org.mozilla.javascript.NativeObject;
|
|
public class SMTJsonFlowNodeScript extends SMTJsonFlowNodeOnlyOutput
|
{
|
public static class SMTJsonFlowNodeScriptArg
|
{
|
public SMTJsonFlowExecArg _execArg;
|
|
public SMTJsonFlowNodeScriptArg(SMTJsonFlowExecArg execArg)
|
{
|
_execArg = execArg;
|
}
|
|
public String getGlobalConfig(String key, String defaultValue) throws Exception {
|
String globalConfig = (String) SMTAIServerApp.getApp().getGlobalConfig(key, defaultValue);
|
return globalConfig;
|
}
|
public String getNowDate() throws Exception {
|
return SMTStatic.toString(new Date());
|
}
|
public String getUUID() throws Exception {
|
return SMTStatic.newUUID();
|
}
|
public void webSocketBroadcast(NativeObject nativeObject) throws Exception {
|
SMTJsonWriter jsonWr = new SMTJsonWriter(false);
|
SMTAIServerApp.convJSToJsonWriter(nativeObject, jsonWr);
|
SMTAIServerApp.getApp().webSocketApp(jsonWr.getFullJson());
|
}
|
|
public Object llmAnswerToJson(String sJson)
|
{
|
Object object = SMTAIServerApp.convJsonToJS(SMTStatic.convLLMAnswerToJson(sJson, false));
|
return object;
|
}
|
|
public Object getArg(String key)
|
{
|
Json jsonValue = _execArg._jsonArgs.safeGetJson(key);
|
if(jsonValue == null)
|
return null;
|
|
if(jsonValue.isPrimitive())
|
return jsonValue.getValue();
|
|
return jsonValue;
|
}
|
|
public void setArg(String key, String value)
|
{
|
_execArg._jsonArgs.set(key, value);
|
}
|
|
public String getGlobalConfig(String key) throws Exception
|
{
|
Object value = SMTAIServerApp.getApp().getGlobalConfig(key, null);
|
if(value == null)
|
return null;
|
|
return SMTStatic.toString(value);
|
}
|
|
public Object queryWeb(NativeObject nvConfig) throws Exception
|
{
|
String url = (String) SMTAIServerApp.getJSValue(nvConfig, "url");
|
String method = (String) SMTAIServerApp.getJSValue(nvConfig, "method", "GET");
|
String resultType = (String) SMTAIServerApp.getJSValue(nvConfig, "result_type", "String");
|
|
String result;
|
if("GET".equalsIgnoreCase(method))
|
{
|
List<String> listArgs = new ArrayList<>();
|
NativeObject nvArgs = (NativeObject) SMTAIServerApp.getJSValue(nvConfig, "args", null);
|
|
if(nvArgs != null)
|
{
|
for(Entry<Object, Object> entry : nvArgs.entrySet())
|
{
|
listArgs.add(SMTStatic.toString(entry.getKey()));
|
listArgs.add(SMTStatic.toString(SMTAIServerApp.unwrapObject(entry.getValue())));
|
}
|
}
|
|
SMTHttpClient web = new SMTHttpClient();
|
result = web.getHttpString(url, listArgs.toArray(new String[listArgs.size()]), null);
|
}
|
else
|
{
|
throw new Exception("unknow web method : " + method);
|
}
|
|
if("String".equalsIgnoreCase(resultType))
|
{
|
return result;
|
}
|
else if("Json".equalsIgnoreCase(resultType))
|
{
|
return SMTAIServerApp.convJsonToJS(Json.read(result));
|
}
|
else
|
{
|
throw new Exception("unknow result type : " + resultType);
|
}
|
}
|
|
public NativeArray getMapLayerList() throws Exception
|
{
|
List<SMTGisMapLayerDef> list = new ArrayList<>();
|
for(SMTGisMapLayerDef layerDef : SMTAIServerApp.getApp().getMapLayerDefMap().values())
|
{
|
list.add(layerDef);
|
}
|
return new NativeArray(list.toArray(new SMTGisMapLayerDef[list.size()]));
|
}
|
|
public NativeArray getMapThemeList() throws Exception
|
{
|
List<SMTMapThemeDef> list = new ArrayList<>();
|
for(SMTMapThemeDef themeDef : SMTAIServerApp.getApp().getMapThemeDefMap().values())
|
{
|
list.add(themeDef);
|
}
|
return new NativeArray(list.toArray(new SMTMapThemeDef[list.size()]));
|
}
|
|
public void sendTableToClent(NativeObject nvArgs) throws Exception
|
{
|
String title = (String) SMTAIServerApp.getJSValue(nvArgs, "title");
|
NativeArray arrCols = (NativeArray)SMTAIServerApp.getJSValue(nvArgs, "columns");
|
NativeArray arrRecs = (NativeArray)SMTAIServerApp.getJSValue(nvArgs, "recs");
|
|
SMTJsonWriter jsonWrResult = _execArg._tranReq.getResultJsonWr();
|
jsonWrResult.addKeyValue("answer_type", "summary");
|
jsonWrResult.beginArray("summary");
|
{
|
jsonWrResult.beginMap(null);
|
{
|
// 加入基本信息
|
jsonWrResult.addKeyValue("type", "recordset");
|
jsonWrResult.addKeyValue("agent_key", "#0/" + SMTStatic.newUUID());
|
jsonWrResult.addKeyValue("chart", "table");
|
jsonWrResult.addKeyValue("title", title);
|
|
// 加入字段列
|
List<String> listColName = new ArrayList<>();
|
jsonWrResult.beginArray("cols");
|
for(int i = 0; i < arrCols.size(); i ++)
|
{
|
NativeObject nvCol = (NativeObject)SMTAIServerApp.unwrapObject(arrCols.get(i));
|
jsonWrResult.beginMap(null);
|
{
|
jsonWrResult.addKeyValue("title", (String)SMTAIServerApp.getJSValue(nvCol, "title"));
|
jsonWrResult.addKeyValue("name", (String)SMTAIServerApp.getJSValue(nvCol, "name"));
|
jsonWrResult.addKeyValue("type", "text");
|
jsonWrResult.addKeyValue("group", false);
|
listColName.add((String)SMTAIServerApp.getJSValue(nvCol, "name"));
|
}
|
jsonWrResult.endMap();
|
}
|
jsonWrResult.endArray();
|
|
// 加入值列
|
jsonWrResult.beginArray("values");
|
for(int i = 0; i < arrRecs.size(); i ++)
|
{
|
NativeObject nvRec = (NativeObject)SMTAIServerApp.unwrapObject(arrRecs.get(i));
|
jsonWrResult.beginArray(null);
|
{
|
for(int j = 0; j < listColName.size(); j ++)
|
{
|
String colName = listColName.get(j);
|
jsonWrResult.addKeyValue(null, SMTAIServerApp.getJSValue(nvRec, colName, null));
|
}
|
}
|
jsonWrResult.endArray();
|
}
|
jsonWrResult.endArray();
|
}
|
jsonWrResult.endMap();
|
}
|
jsonWrResult.endArray();
|
|
_execArg._tranReq.sendChunkedResultBlock();
|
}
|
|
public void sendChartToClient(NativeObject nvArgs) throws Exception
|
{
|
String title = (String) SMTAIServerApp.getJSValue(nvArgs, "title");
|
String colTime = (String) SMTAIServerApp.getJSValue(nvArgs, "col_time");
|
String colName = (String) SMTAIServerApp.getJSValue(nvArgs, "col_name");
|
String colValue = (String) SMTAIServerApp.getJSValue(nvArgs, "col_value");
|
NativeArray arrRecs = (NativeArray) SMTAIServerApp.getJSValue(nvArgs, "recs");
|
|
|
SMTJsonWriter jsonWrResult = _execArg._tranReq.getResultJsonWr();
|
jsonWrResult.addKeyValue("answer_type", "summary");
|
jsonWrResult.beginArray("summary");
|
{
|
jsonWrResult.beginMap(null);
|
{
|
// 加入基本信息
|
jsonWrResult.addKeyValue("type", "recordset");
|
jsonWrResult.addKeyValue("agent_key", "#0/" + SMTStatic.newUUID());
|
jsonWrResult.addKeyValue("chart", "muli_line");
|
jsonWrResult.addKeyValue("title", title);
|
|
// 加入字段名
|
jsonWrResult.beginArray("cols");
|
{
|
jsonWrResult.beginMap(null);
|
{
|
jsonWrResult.addKeyValue("title", "时间");
|
jsonWrResult.addKeyValue("type", "time");
|
}
|
jsonWrResult.endMap();
|
|
jsonWrResult.beginMap(null);
|
{
|
jsonWrResult.addKeyValue("title", "名称");
|
jsonWrResult.addKeyValue("type", "name");
|
}
|
jsonWrResult.endMap();
|
|
jsonWrResult.beginMap(null);
|
{
|
jsonWrResult.addKeyValue("title", "值");
|
jsonWrResult.addKeyValue("type", "value");
|
}
|
jsonWrResult.endMap();
|
}
|
jsonWrResult.endArray();
|
|
// 加入值
|
jsonWrResult.beginArray("values");
|
for(int i = 0; i < arrRecs.size(); i ++)
|
{
|
NativeObject nvRec = (NativeObject)SMTAIServerApp.unwrapObject(arrRecs.get(i));
|
jsonWrResult.beginArray(null);
|
{
|
jsonWrResult.addKeyValue(null, SMTAIServerApp.getJSValue(nvRec, colTime, null));
|
jsonWrResult.addKeyValue(null, SMTAIServerApp.getJSValue(nvRec, colName, null));
|
jsonWrResult.addKeyValue(null, SMTAIServerApp.getJSValue(nvRec, colValue, null));
|
}
|
jsonWrResult.endArray();
|
}
|
jsonWrResult.endArray();
|
}
|
jsonWrResult.endMap();
|
}
|
jsonWrResult.endArray();
|
|
_execArg._tranReq.sendChunkedResultBlock();
|
}
|
|
public void sendKnowledgeToClient(NativeObject nvArgs) throws Exception
|
{
|
String result = (String) SMTAIServerApp.getJSValue(nvArgs, "result");
|
SMTJsonWriter jsonWrResult = _execArg._tranReq.getResultJsonWr();
|
jsonWrResult.addKeyValue("answer_type", "knowledge");
|
jsonWrResult.beginArray("knowledge");
|
{
|
jsonWrResult.beginMap(null);
|
{
|
jsonWrResult.addKeyValue("answer", result);
|
}
|
jsonWrResult.endMap();
|
}
|
jsonWrResult.endArray();
|
|
_execArg._tranReq.sendChunkedResultBlock();
|
}
|
|
public void sendResultToClient(NativeObject nvArgs) throws Exception
|
{
|
SMTAIServerApp.convJSToJsonWriter(nvArgs, _execArg._tranReq.getResultJsonWr());
|
_execArg._tranReq.sendChunkedResultBlock();
|
}
|
|
public void sendErrorToClient(String errMsg)throws Exception
|
{
|
_execArg._tranReq.sendChunkedBlock("summary", Json.object(
|
"json_ok", false,
|
"err_code", "MESSAGE",
|
"json_msg", errMsg
|
));
|
_execArg._tranReq.sendChunkedBlock("error", errMsg);
|
}
|
|
public void sendJsonToClient(String type, NativeObject nvArgs)throws Exception
|
{
|
SMTJsonWriter jsonWr = new SMTJsonWriter(false);
|
SMTAIServerApp.convJSToJsonWriter(nvArgs, jsonWr);
|
_execArg._tranReq.sendChunkedBlock(type, jsonWr.getFullJson());
|
}
|
|
public NativeArray querySQL(String sql, NativeObject nvParams) throws Exception
|
{
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
return querySQL(db, sql, nvParams);
|
}
|
|
public NativeArray querySQL(String dsId, String sql, NativeObject nvParams) throws Exception
|
{
|
SMTDatabase db = SMTAIServerApp.getApp().getDataSource(dsId).allocDatabase();
|
return querySQL(db, sql, nvParams);
|
}
|
|
public int executeSQL(String sql, NativeObject nvParams) throws Exception
|
{
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
return executeSQL(db, sql, nvParams);
|
}
|
|
public int executeSQL(String dsId, String sql, NativeObject nvParams) throws Exception
|
{
|
SMTDatabase db = SMTAIServerApp.getApp().getDataSource(dsId).allocDatabase();
|
return executeSQL(db, sql, nvParams);
|
}
|
|
|
private int executeSQL(SMTDatabase db, String sql, NativeObject nvParams) throws Exception
|
{
|
List<Object> sqlParams = new ArrayList<>();
|
try
|
{
|
// 解析出原始sql
|
String rawSQL = SMTStatic.stringFormat(sql, new SMTStatic.StringNamedNotify()
|
{
|
@Override
|
public Object getNamedValue(String name, Object[] args) throws Exception
|
{
|
char type;
|
String value = SMTStatic.toString(SMTAIServerApp.getJSValue(nvParams, name));
|
if(value.length() == 1)
|
{
|
type = value.charAt(0);
|
value = "";
|
}
|
else
|
{
|
type = value.charAt(0);
|
value = value.substring(1);
|
|
}
|
|
Object ovalue;
|
|
switch(type)
|
{
|
case 'N':
|
ovalue = null;
|
break;
|
|
case 'I':
|
ovalue = SMTStatic.toInt(value);
|
break;
|
|
case 'D':
|
ovalue = SMTStatic.toDouble(value);
|
break;
|
|
case 'L':
|
ovalue = SMTStatic.toLong(value);
|
break;
|
|
case 'T':
|
ovalue = SMTStatic.toDate(value);
|
break;
|
|
default:
|
ovalue = value;
|
break;
|
}
|
|
sqlParams.add(ovalue);
|
return "?";
|
}
|
});
|
|
|
// 执行查询
|
int ret = db.executeSQL(rawSQL, sqlParams.toArray(new Object[sqlParams.size()]));
|
|
return ret;
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
|
private NativeArray querySQL(SMTDatabase db, String sql, NativeObject nvParams) throws Exception
|
{
|
List<Object> sqlParams = new ArrayList<>();
|
List<NativeObject> listRecs = new ArrayList<>();
|
try
|
{
|
// 解析出原始sql
|
String rawSQL = SMTStatic.stringFormat(sql, new SMTStatic.StringNamedNotify()
|
{
|
@Override
|
public Object getNamedValue(String name, Object[] args) throws Exception
|
{
|
char type;
|
String value = SMTStatic.toString(SMTAIServerApp.getJSValue(nvParams, name));
|
if(value.length() == 1)
|
{
|
type = value.charAt(0);
|
value = "";
|
}
|
else
|
{
|
type = value.charAt(0);
|
value = value.substring(1);
|
|
}
|
|
Object ovalue;
|
|
switch(type)
|
{
|
case 'N':
|
ovalue = null;
|
break;
|
|
case 'I':
|
ovalue = SMTStatic.toInt(value);
|
break;
|
|
case 'D':
|
ovalue = SMTStatic.toDouble(value);
|
break;
|
|
case 'L':
|
ovalue = SMTStatic.toLong(value);
|
break;
|
|
case 'T':
|
ovalue = SMTStatic.toDate(value);
|
break;
|
|
default:
|
ovalue = value;
|
break;
|
}
|
|
sqlParams.add(ovalue);
|
return "?";
|
}
|
});
|
|
|
// 执行查询
|
db.querySQLNotify(rawSQL, sqlParams.toArray(new Object[sqlParams.size()]), new DBQueryNotify() {
|
|
@Override
|
public boolean onNextRecord(DBRecord rec) throws Exception
|
{
|
NativeObject nvRec = new NativeObject();
|
for(Entry<String, Integer> entry : rec.getFieldMap().entrySet())
|
{
|
String colName = entry.getKey();
|
String value = rec.getString(entry.getValue());
|
if(value == null)
|
continue;
|
SMTAIServerApp.putJSNotNullValue(nvRec, colName, value);
|
}
|
listRecs.add(nvRec);
|
|
return true;
|
}
|
|
});
|
|
return new NativeArray(listRecs.toArray(new NativeObject[listRecs.size()]));
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
protected Function _func;
|
|
@Override
|
public void initInstane(SMTJsonFlowManager manager, Json jsonNode) throws Exception
|
{
|
super.initInstane(manager, jsonNode);
|
|
List<Json> jsonGroupParams = jsonNode.getJsonPath("data|group_params|", false).asJsonList();
|
for(Json jsonParams : jsonGroupParams)
|
{
|
String type = jsonParams.getJsonPath("params|0|type", false).asString();
|
if("code".equals(type))
|
{
|
SMTJsonFlowScriptJet scriptJet = this._manager.allocScriptJet();
|
try
|
{
|
String code = "function(args){" + jsonParams.getJsonPath("params|0|value", false).asString() + "}";
|
Context cx = scriptJet.entryContext();
|
try
|
{
|
_func = scriptJet.compileFunction(cx, this.getTitle(), code);
|
}
|
catch(Exception ex)
|
{
|
throw new Exception("compile js code error : \n" + code, ex);
|
}
|
finally
|
{
|
Context.exit();
|
}
|
}
|
finally
|
{
|
scriptJet.close();
|
}
|
|
}
|
}
|
}
|
|
@Override
|
public void afterInstance() throws Exception
|
{
|
super.afterInstance();
|
|
if(_func == null)
|
throw new Exception("script function code is not define");
|
}
|
|
@Override
|
public SMTJavaAIError executeFlowNode(SMTJsonFlowExecArg execArg) throws Exception
|
{
|
SMTJsonFlowScriptJet scriptJet = this._manager.allocScriptJet();
|
try
|
{
|
Context cx = scriptJet.entryContext();
|
try
|
{
|
SMTJsonFlowNodeScriptArg arg = new SMTJsonFlowNodeScriptArg(execArg);
|
|
scriptJet.callFunction(cx, _func, new Object[] {arg});
|
}
|
finally
|
{
|
Context.exit();
|
}
|
}
|
finally
|
{
|
scriptJet.close();
|
}
|
return super.executeFlowNode(execArg);
|
}
|
}
|