package com.smtaiserver.smtaiserver.javaai.qwen.agent.script; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import org.mozilla.javascript.Context; import org.mozilla.javascript.ImporterTopLevel; import org.mozilla.javascript.NativeArray; import org.mozilla.javascript.NativeObject; import org.mozilla.javascript.ScriptableObject; import com.smtaiserver.smtaiserver.core.SMTAIServerApp; import com.smtaiserver.smtaiserver.core.SMTAIServerRequest; import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap; import com.smtservlet.util.Json; import com.smtservlet.util.SMTJsonWriter; import com.smtservlet.util.SMTStatic; import com.smtaiserver.smtaiserver.database.SMTDatabase; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBQueryNotify; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord; public class SMTQwenAgentScriptScope extends ImporterTopLevel { private Json _jsonArgs; private ASTDBMap _dbMap; @SuppressWarnings("unused") private SMTQwenAgentScriptJet _scriptJet; private SMTAIServerRequest _tranReq; public SMTQwenAgentScriptScope(Json jsonArgs, ASTDBMap dbMap, SMTQwenAgentScriptJet scriptJet, SMTAIServerRequest tranReq) { _dbMap = dbMap; _jsonArgs = jsonArgs; _scriptJet = scriptJet; _tranReq = tranReq; } public void __init__(Context cx) throws Exception { // Define some global functions particular to the shell. Note // that these functions are not part of ECMA. initStandardObjects(cx, false); String[] funcListArr = new String[]{ "getArgValue", "queryRecord", "outputTimeChart", "outputTable", "outputError" }; defineRunFunctions(this.getClass(), funcListArr); } protected void defineRunFunctions(Class clz, String[] names) { defineFunctionProperties(names, clz, ScriptableObject.DONTENUM); } public String getArgValue(String key) { Json jsonValue = _jsonArgs.getJson(key); return jsonValue.asString(); } // queryRecord(表名, 字段列表, 时间分组, 排序字段列表, 限制记录信息, 查询过滤条件) // 功能: // 查询带时间范围的SQL语句,返回查询结果集。 // 参数: // 表名: 要查询的表名 // 字段列表: 要查询的字段名列表: [字段1, 字段2, 字段3... ],这里只能放字段名,不能放任何运算操作 // 时间分组: 用于聚合操作的时间分组。 // 格式:{"col":时间字段, "agg":聚合方式(例如:AVG,SUM,MAX,MIN等), "time":分组时间段(例如:1 hours, 1 days,如果问题中未提到时间步长,则不设置。禁止捏造不存在的时间步长)},如果不存在,则设置为null // 排序字段列表: 用于排序的字段及排序信息。 // 格式:[{"col":第一个排序字段名, "order":第一个排序字段顺序(ASC,DESC)], ....] ,如果不存在则设置为null // 限制记录信息: 用于限制输出条目数的配置。 // 格式:{"start":限制记录的起始位置,"limit":限制记录的条目数}, 如果不存在则设置为null // 查询过滤条件: 用于过滤查询SQL的条件信息 // 格式:[{"col":查询条件字段名1, "op":查询条件操作符1, "value":查询值1}, ....],如果查询操作符是IN,BETWEEN之类有多个值的,那查询值就是["值1","值2"...],否者查询值就是一个字符串。如果要查询时间,请直接指定查询时间的范围,不允许吧时间拆成年月日分别判断。 // 返回: // 将查询后的结果返回 // 格式:[{字段1:值1, 字段2:值2},{字段1:值3, 字段2:值4}...] public NativeArray queryRecord(String tableName, NativeArray arrColumns, NativeObject arrTimeGroup, NativeArray arrOrderColumns, NativeObject arrLimit, NativeArray arrFilters) throws Exception { StringBuilder sbSQL = new StringBuilder(); sbSQL.append("SELECT "); for(int i = 0; i < arrColumns.size(); i ++) { String colName = SMTStatic.toString(SMTAIServerApp.unwrapObject(arrColumns.get(i))); if(i > 0) sbSQL.append(","); sbSQL.append(colName); } return null; } public NativeArray queryRecord1(String tableName, NativeArray arrColumns, NativeObject arrTimeGroup, NativeArray arrOrderColumns, NativeObject arrLimit, NativeArray arrFilters) throws Exception { if(tableName.startsWith("dev_names")) { NativeObject nvRec = new NativeObject(); SMTAIServerApp.putJSNotNullValue(nvRec, "QUOTA_TYPE", "SDVAL_FLOW_W"); SMTAIServerApp.putJSNotNullValue(nvRec, "QUOTA_NAME", "D_QSS130_LL"); return new NativeArray(new Object[] {nvRec}); } else { SMTDatabase db = _dbMap.getDatabase("DS_43"); { StringBuilder sbSQL = new StringBuilder(); sbSQL.append("SELECT "); for(int i = 0; i < arrColumns.size(); i ++) { String colName = SMTStatic.toString(SMTAIServerApp.unwrapObject(arrColumns.get(i))); if(i > 0) sbSQL.append(","); sbSQL.append(colName); } sbSQL.append(" FROM (SELECT otype as quota_type, oname as quota_name, oname as QUOTA_TITLE, OTIME, SDVAL from sd_values.sd_raws_match) T"); if(arrFilters != null && arrFilters.size() > 0) { sbSQL.append(" WHERE "); for(int i = 0; i < arrFilters.size(); i ++) { if(i > 0) sbSQL.append(" AND "); NativeObject nvFilter = (NativeObject) SMTAIServerApp.unwrapObject(arrFilters.get(i)); String field = (String) SMTAIServerApp.getJSValue(nvFilter, "col"); String op = (String) SMTAIServerApp.getJSValue(nvFilter, "op"); if("BETWEEN".equals(op)) { NativeArray arrBetween = (NativeArray)SMTAIServerApp.getJSValue(nvFilter, "value"); sbSQL.append(field); sbSQL.append(" BETWEEN "); String value1 = (String)SMTAIServerApp.unwrapObject(arrBetween.get(0)); sbSQL.append("'" + value1.replace("'", "''") + "'") ; sbSQL.append(" AND "); String value2 = (String)SMTAIServerApp.unwrapObject(arrBetween.get(1)); sbSQL.append("'" + value2.replace("'", "''") + "'") ; } else { String value = (String)SMTAIServerApp.getJSValue(nvFilter, "value"); sbSQL.append(field); sbSQL.append(op); sbSQL.append("'" + value.replace("'", "''") + "'"); } } } List listRec = new ArrayList<>(); db.querySQLNotify(sbSQL.toString(), null, new DBQueryNotify() { @Override public boolean onNextRecord(DBRecord rec) throws Exception { NativeObject nvRec = new NativeObject(); for(Entry entry : rec.getFieldMap().entrySet()) { String value = rec.getString(entry.getValue()); if(value == null) continue; SMTAIServerApp.putJSNotNullValue(nvRec, entry.getKey(), value); } listRec.add(nvRec); return true; } }); return new NativeArray(listRec.toArray(new NativeObject[listRec.size()])); } } } // outputTimeChart(记录集, 名称字段名, 时间字段名, 值字段名,标题名) // 功能: // 以曲线结果记录形式将多组同类型的记录集输出到客户 // 参数: // 记录集: 要输出的由queryRecord函数返回的相同类型的记录集 // 名称字段名 : 曲线结果中代表指标名称的字段名 // 时间字段名 : 用于记录时间的字段名 // 值字段名: 用于记录值的字段名 // 标题名 : 当前输出曲线的标题名 // 返回: // 无 public void outputTimeChart(NativeArray arrRecs, String nameColumn, String timeColumn, String valueColumn, String chartTitle) throws Exception { String title = (String) chartTitle; SMTJsonWriter jsonWrResult = _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, timeColumn, null)); jsonWrResult.addKeyValue(null, SMTAIServerApp.getJSValue(nvRec, nameColumn, null)); jsonWrResult.addKeyValue(null, SMTAIServerApp.getJSValue(nvRec, valueColumn, null)); } jsonWrResult.endArray(); } jsonWrResult.endArray(); } jsonWrResult.endMap(); } jsonWrResult.endArray(); _tranReq.sendChunkedResultBlock(); } public void outputError(String message) throws Exception { _tranReq.sendChunkedBlock("begin", message); } // outputTable(记录集, 表格标题名, 字段名列表, 字段标题列表, 分组字段名列表) // 功能: // 以表格形式输出记录集到客户 // 参数: // 记录集: 要输出的由queryRecord函数返回的记录集 // 表格标题名 : 表格输出时候定义的名字 // 字段名列表 : 要输出的字段名列表,[字段1,字段2,...] // 字段标题列表: 字段名对应的标题列表, 如果标题不存在,则用字段名填充 [标题1, 标题2...] // 分组字段名列表: 如果记录集中包含分组字段,则输出分组字段列表,否则设置为null // 返回: // 无 public void outputTable(NativeArray arrRS, String tableTitle, NativeArray arrColNames, NativeArray arrColTitles, NativeArray arrGroupName) throws Exception { String title = tableTitle; NativeArray arrRecs = arrRS; SMTJsonWriter jsonWrResult = _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 < arrColNames.size(); i ++) { String colName = (String)SMTAIServerApp.unwrapObject(arrColNames.get(i)); String colTitle = (String)SMTAIServerApp.unwrapObject(arrColTitles.get(i)); jsonWrResult.beginMap(null); { jsonWrResult.addKeyValue("title", colTitle); jsonWrResult.addKeyValue("name", colName); jsonWrResult.addKeyValue("type", "text"); jsonWrResult.addKeyValue("group", false); listColName.add(colName); } 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(); _tranReq.sendChunkedResultBlock(); } }