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 listArgs = new ArrayList<>(); NativeObject nvArgs = (NativeObject) SMTAIServerApp.getJSValue(nvConfig, "args", null); if(nvArgs != null) { for(Entry 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 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 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 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 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 sqlParams = new ArrayList<>(); List 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 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 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); } }