已修改6个文件
386 ■■■■ 文件已修改
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/javaai/jsonflow/node/SMTJsonFlowNodeScript.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/javaai/qwen/agent/SMTQwenAgentJavascript.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/javaai/qwen/agent/script/SMTQwenAgentScriptScope.java 133 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JAVA/SMTServlet/src/main/java/com/smtservlet/exception/SMTControlExceptionResolver.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTJavaAIControl.java
@@ -412,6 +412,132 @@
    return tranReq.returnJsonState(true, null, null);
  }
    public ModelAndView updateOrder(SMTAIServerRequest tranReq) throws Exception {
        String title = tranReq.convParamToString("title", true);
        String orderId = tranReq.convParamToString("orderId", true);
        String wstypeid = tranReq.convParamToString("wstypeid", false);
        String wstypename = tranReq.convParamToString("wstypename", false);
        String urgencylevel = tranReq.convParamToString("urgencylevel", false);
        String shape = tranReq.convParamToString("shape", false);
        String deadline = tranReq.convParamToString("deadline", false);
        String stepstatus = tranReq.convParamToString("stepstatus", false);
        String originatetypetext = tranReq.convParamToString("originatetypetext", false);
        String content = tranReq.convParamToString("content", false);
        String address = tranReq.convParamToString("address", false);
        String stepid = tranReq.convParamToString("stepid", false);
        String org = tranReq.convParamToString("org", false);
        String deptname = tranReq.convParamToString("deptname", false);
        String dealtime = tranReq.convParamToString("dealtime", false);
        String username = tranReq.convParamToString("username", false);
        String contactname = tranReq.convParamToString("contactname", false);
        String contactphone = tranReq.convParamToString("contactphone", false);
        String acceptuserid = tranReq.convParamToString("acceptuserid", false);
        String acceptusername = tranReq.convParamToString("acceptusername", false);
        String acceptuseraccount = tranReq.convParamToString("acceptuseraccount", false);
        String dealuserid = tranReq.convParamToString("dealuserid", false);
        String dealusername = tranReq.convParamToString("dealusername", false);
        String dealuseraccount = tranReq.convParamToString("dealuseraccount", false);
        String flowstatus = tranReq.convParamToString("flowstatus", false);
        String attachment = tranReq.convParamToString("attachment", false);
        String creator = tranReq.convParamToString("creator", false);
        String isplan = tranReq.convParamToString("isplan", false);
        String originateid = tranReq.convParamToString("originateid", false);
        String appointstarttime = tranReq.convParamToString("appointstarttime", false);
        String appointendtime = tranReq.convParamToString("appointendtime", false);
        String parentid = tranReq.convParamToString("parentid", false);
        String relateids = tranReq.convParamToString("relateids", false);
        String oname = tranReq.convParamToString("oname", false);
        String otype = tranReq.convParamToString("otype", false);
        SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
        try {
            db.executeSQL(
                    "UPDATE work_order_list SET "
                            + "title = ?, "
                            + "wstypeid = ?, "
                            + "wstypename = ?, "
                            + "urgencylevel = ?, "
                            + "shape = ?, "
                            + "deadline = ?, "
                            + "stepstatus = ?, "
                            + "originatetypetext = ?, "
                            + "content = ?, "
                            + "address = ?, "
                            + "step_id = ?, "
                            + "org = ?, "
                            + "deptname = ?, "
                            + "dealtime = ?, "
                            + "username = ?, "
                            + "contactname = ?, "
                            + "contactphone = ?, "
                            + "acceptuserid = ?, "
                            + "acceptusername = ?, "
                            + "acceptuseraccount = ?, "
                            + "dealuserid = ?, "
                            + "dealusername = ?, "
                            + "dealuseraccount = ?, "
                            + "flowstatus = ?, "
                            + "attachment = ?, "
                            + "creator = ?, "
                            + "createtime = ?, "
                            + "isplan = ?, "
                            + "originateid = ?, "
                            + "appointstarttime = ?, "
                            + "appointendtime = ?, "
                            + "parentid = ?, "
                            + "relateids = ?, "
                            + "is_notify = ?, "
                            + "oname = ?, "
                            + "otype = ? "
                            + "WHERE order_id = ?",
                    new Object[]{
                            title,
                            wstypeid,
                            wstypename,
                            urgencylevel,
                            shape,
                            deadline,
                            stepstatus,
                            originatetypetext,
                            content,
                            address,
                            stepid,
                            org,
                            deptname,
                            dealtime,
                            username,
                            contactname,
                            contactphone,
                            acceptuserid,
                            acceptusername,
                            acceptuseraccount,
                            dealuserid,
                            dealusername,
                            dealuseraccount,
                            flowstatus,
                            attachment,
                            creator,
                            new Date(),
                            isplan,
                            originateid,
                            appointstarttime,
                            appointendtime,
                            parentid,
                            relateids,
                            "N",
                            oname,
                            otype,
                            orderId
                    });
        } finally {
            db.close();
        }
        return tranReq.returnJsonState(true, null, null);
    }
    public ModelAndView getOrderList(SMTAIServerRequest tranReq) throws Exception {
        SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
        SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/javaai/jsonflow/node/SMTJsonFlowNodeScript.java
@@ -53,7 +53,8 @@
        
        public Object llmAnswerToJson(String sJson)
        {
            return SMTAIServerApp.convJsonToJS(SMTStatic.convLLMAnswerToJson(sJson, false));
            Object object = SMTAIServerApp.convJsonToJS(SMTStatic.convLLMAnswerToJson(sJson, false));
            return object;
        }
        public Object getArg(String key)
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/javaai/qwen/agent/SMTQwenAgentJavascript.java
@@ -58,39 +58,52 @@
    @Override
    public SMTJavaAIError callAgents(String jsonPath, Json jsonArgs, SMTLLMConnect llm, String question, SMTAIServerRequest tranReq) throws Exception 
    {
        // 分析生成js代码
        String jsCode = llm.callWithMessage(new String[] {_prompt}, question, tranReq).replace("\r", "");
        tranReq.traceLLMDebug(jsCode);
        jsCode = SMTStatic.convLLMAnswerToJavascript(jsCode);
        jsCode = "function ffffff(){" + jsCode + "};ffffff();";
        //String jsCode = "var arr = testRS(); var l = arr[0]; for(var i in arr){}";
        try(ASTDBMap dbMap = new ASTDBMap())
        int maxCount = 1;
        // 失败最多尝试3次
        for(int j = 1; j <= maxCount; j ++)
        {
            // 执行脚本
            SMTQwenAgentScriptJet scriptJet = new SMTQwenAgentScriptJet(jsonArgs, dbMap, tranReq);
            try
            // 分析生成js代码
            String jsCode = llm.callWithMessage(new String[] {_prompt}, question, tranReq).replace("\r", "");
            tranReq.traceLLMDebug(jsCode);
            jsCode = SMTStatic.convLLMAnswerToJavascript(jsCode);
            jsCode = "function ffffff(){" + jsCode + "};ffffff();";
            //String jsCode = "var arr = testRS(); var l = arr[0]; for(var i in arr){}";
            try(ASTDBMap dbMap = new ASTDBMap())
            {
                Context cx = scriptJet.entryContext();
                // 执行脚本
                SMTQwenAgentScriptJet scriptJet = new SMTQwenAgentScriptJet(jsonArgs, dbMap, tranReq);
                try
                {
                    scriptJet.executeScript(cx, jsCode);
                    Context cx = scriptJet.entryContext();
                    try
                    {
                        scriptJet.executeScript(cx, jsCode);
                        break;
                    }
                    finally
                    {
                        Context.exit();
                    }
                }
                finally
                catch(Exception ex)
                {
                    Context.exit();
                    StringBuilder sbCode = new StringBuilder();
                    String[] lines = jsCode.replace("\r", "").split("\n");
                    for(int i = 0; i < lines.length; i ++)
                    {
                        sbCode.append(String.format("%04d %s", i + 1, lines[i]) + "\n");
                        _logger.fatal(String.format("%04d %s", i + 1, lines[i]));
                    }
                    tranReq.sendChunkedBlock("begin", "解析失败(" + ex.getMessage() + "),重新解析");
                    if(j < maxCount)
                        _logger.fatal("execute js agent error : " + this.getAgentId() + "\n" + sbCode, ex);
                    else
                        throw new Exception("execute js agent error : " + this.getAgentId() + "\n" + sbCode + "\n" + SMTStatic.toString(ex));
                }
            }
            catch(Exception ex)
            {
                String[] lines = jsCode.replace("\r", "").split("\n");
                for(int i = 0; i < lines.length; i ++)
                {
                    _logger.fatal(String.format("%04d %s", i + 1, lines[i]));
                }
                throw new Exception("execute js agent error : " + this.getAgentId() + "\n" + SMTStatic.toString(ex));
            }
        }
        return null;
JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/javaai/qwen/agent/script/SMTQwenAgentScriptScope.java
@@ -1,9 +1,14 @@
package com.smtaiserver.smtaiserver.javaai.qwen.agent.script;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ImporterTopLevel;
@@ -17,6 +22,7 @@
import com.smtservlet.util.Json;
import com.smtservlet.util.SMTJsonWriter;
import com.smtservlet.util.SMTStatic;
import com.smtservlet.util.SMTStatic.SMTCalcTime;
import com.smtaiserver.smtaiserver.database.SMTDatabase;
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBQueryNotify;
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
@@ -28,6 +34,8 @@
    @SuppressWarnings("unused")
    private SMTQwenAgentScriptJet     _scriptJet;
    private SMTAIServerRequest         _tranReq;
    private static Pattern            _patTimeStep = java.util.regex.Pattern.compile("(\\d+)\\s+(days|years|months)");
    
    public SMTQwenAgentScriptScope(Json jsonArgs, ASTDBMap dbMap, SMTQwenAgentScriptJet scriptJet, SMTAIServerRequest tranReq)
@@ -49,7 +57,8 @@
            "queryRecord",
            "outputTimeChart",
            "outputTable",
            "outputError"
            "outputError",
            "joinRecordset"
        };
        defineRunFunctions(this.getClass(), funcListArr);
    }
@@ -65,6 +74,79 @@
        
        return jsonValue.asString();
    }
//    joinRecordset(记录集1, 记录集2, 对比字段名, 相差的时间范围)
//    功能:
//         将两个记录集按照对比字段进行合并,合并后的结果是:[[记录集1中相同字段记录, 记录集2中相同字段记录], .....]
//    参数:
//         记录集1:由queryRecord函数返回的记录集1
//         记录集2:由queryRecord函数返回的记录集2
//         相差的时间范围 : 如果要join的两组记录并不是来自同一个时间范围的,则需要计算:记录集2的起始时间-记录集1的起始时间,用 1 months, 1 days等形式表示,如果相同则为null
//    返回:
//         合并后的结果集
//         格式:[[记录集1中相同字段记录, 记录集2中相同字段记录], .....]
    public NativeArray joinRecordset(NativeArray arrRecs1, NativeArray arrRecs2, String keyColumn, String diffTime) throws Exception
    {
        Map<String, NativeObject[]> mapKey2Recs = new LinkedHashMap<>();
        int timeStep = 0;
        SMTCalcTime timeUnit = null;
        if(!SMTStatic.isNullOrEmpty(diffTime))
        {
            Matcher m = _patTimeStep.matcher(diffTime);
            if(!m.find())
                throw new Exception("time step error : " + diffTime);
            timeStep = SMTStatic.toInt(m.group(1));
            String sUnit = m.group(2);
            if("years".equals(sUnit))
                timeUnit = SMTCalcTime.ADD_YEAR;
            else if("days".equals(sUnit))
                timeUnit = SMTCalcTime.ADD_DATE;
            else if("months".equals(sUnit))
                timeUnit = SMTCalcTime.ADD_MONTH;
            else
                throw new Exception("time step unsupport : " + diffTime);
        }
        // 加入第一个记录集
        for(int i = 0; i < arrRecs1.size(); i ++)
        {
            NativeObject nvRec = (NativeObject) SMTAIServerApp.unwrapObject(arrRecs1.get(i));
            String key = (String) SMTAIServerApp.getJSValue(nvRec, keyColumn);
            mapKey2Recs.put(key, new NativeObject[] {nvRec, null});
        }
        // 加入第二个记录集
        for(int i = 0; i < arrRecs2.size(); i ++)
        {
            NativeObject nvRec = (NativeObject) SMTAIServerApp.unwrapObject(arrRecs2.get(i));
            String key = (String) SMTAIServerApp.getJSValue(nvRec, keyColumn);
            if(timeStep != 0)
            {
                key = SMTStatic.toString(SMTStatic.calculateTime(SMTStatic.toDate(key), timeUnit, timeStep));
            }
            NativeObject[] arrRecs = mapKey2Recs.get(key);
            if(arrRecs == null)
                continue;
            arrRecs[1] = nvRec;
        }
        // 生成最终结果
        List<NativeArray> list = new ArrayList<>();
        for(NativeObject[] recList : mapKey2Recs.values())
        {
            if(recList[1] == null)
                continue;
            list.add(new NativeArray(recList));
        }
        return new NativeArray(list.toArray(new NativeArray[list.size()]));
    }
    
//    queryRecord(表名, 字段列表, 时间分组, 排序字段列表, 限制记录信息, 查询过滤条件) 
//    功能:
@@ -112,7 +194,7 @@
        StringBuilder sbTable = new StringBuilder();
        
        boolean isDevice = false;
        if("dev_names".equals(tableName))
        if("dev_names".equalsIgnoreCase(tableName))
        {
            tableName = 
                      "    (SELECT\r\n"
@@ -130,7 +212,7 @@
                    + ") T";
            isDevice = true;
        }
        else if("quota_values".equals(tableName))
        else if("quota_value".equalsIgnoreCase(tableName))
        {
            tableName = "(SELECT otime, sdval, otype as QUOTA_TYPE, oname as QUOTA_NAME FROM sd_values.sd_raws_match) T";
        }
@@ -163,9 +245,28 @@
                    {
                        if("DEVICE_NAME".equalsIgnoreCase(colName))
                        {
                            sbWhere.append("DEVICE_NAME LIKE '%");
                            sbWhere.append(SMTStatic.toString(SMTAIServerApp.unwrapObject(SMTAIServerApp.getJSValue(nvFilter, "value"))).replace("'", "''"));
                            sbWhere.append("%'");
                            if("IN".equalsIgnoreCase(filterOP))
                            {
                                NativeArray arrValues = (NativeArray)SMTAIServerApp.getJSValue(nvFilter, "value");
                                sbWhere.append("(");
                                for(int ii = 0; ii < arrValues.size(); ii ++)
                                {
                                    if(ii > 0)
                                        sbWhere.append(" OR ");
                                    sbWhere.append("DEVICE_NAME LIKE '%");
                                    sbWhere.append(SMTStatic.toString(SMTAIServerApp.unwrapObject(arrValues.get(ii))).replace("'", "''"));
                                    sbWhere.append("%'");
                                }
                                sbWhere.append(")");
                            }
                            else
                            {
                                sbWhere.append("DEVICE_NAME LIKE '%");
                                sbWhere.append(SMTStatic.toString(SMTAIServerApp.unwrapObject(SMTAIServerApp.getJSValue(nvFilter, "value"))).replace("'", "''"));
                                sbWhere.append("%'");
                            }
                        }
                        else if("QUOTA_TYPE".equalsIgnoreCase(colName))
                        {
@@ -229,11 +330,6 @@
        if(sbWhere.length() > 0)
            sbSQL.append("WHERE " + sbWhere.toString() + "\n");
        if(sbOrder.length() > 0)
            sbSQL.append("ORDER BY " + sbOrder.toString() + "\n");
        if(sbLimit.length() > 0)
            sbSQL.append(" " + sbLimit.toString());
        
        String sql = sbSQL.toString();
        
@@ -243,22 +339,31 @@
            String colTime = (String) SMTAIServerApp.getJSValue(nvTimeGroup, "col");
            String funcAgg = (String) SMTAIServerApp.getJSValue(nvTimeGroup, "agg_func");
            String colAgg = (String) SMTAIServerApp.getJSValue(nvTimeGroup, "agg_col");
            String aliasName = (String) SMTAIServerApp.getJSValue(nvTimeGroup, "alias_col");
            String timeStep =  (String) SMTAIServerApp.getJSValue(nvTimeGroup, "time", null);
            
            if(SMTStatic.isNullOrEmpty(timeStep))
            {
                sql = "SELECT " + funcAgg + "(" + colAgg + ") AS " + colAgg + " FROM (" + sql + ") T";
                sql = "SELECT " + funcAgg + "(" + colAgg + ") AS " + aliasName + " FROM (" + sql + ") T";
            }
            else
            {
                sql = 
                      " SELECT time_bucket('" + timeStep + "', " + colTime  + ") AS " + colTime + "," + funcAgg + "(" + colAgg + ") AS " + colAgg
                      " SELECT time_bucket('" + timeStep + "', " + colTime  + ") AS " + colTime + "," + funcAgg + "(" + colAgg + ") AS " + aliasName
                    + " FROM (" + sql + ") T"
                    + " GROUP BY time_bucket('" + timeStep + "', " + colTime  + ")"
                    ;
            }
            sql = "SELECT * FROM (\n" + sql + "\n) T\n";
        }
        
        if(sbOrder.length() > 0)
            sql += "ORDER BY " + sbOrder.toString() + "\n";
        if(sbLimit.length() > 0)
            sql += " " + sbLimit.toString();
        
        SMTDatabase db = _dbMap.getDatabase("DS_43");
        List<NativeObject> recList = new ArrayList<>();
@@ -272,7 +377,7 @@
                for(Entry<String, Integer> entry : rec.getFieldMap().entrySet())
                {
                    SMTAIServerApp.putJSNotNullValue(nvRec, 
                        entry.getKey(), rec.getValue(entry.getValue()));
                        entry.getKey(), rec.getString(entry.getValue()));
                }
                return true;
            }
JAVA/SMTAIServer/src/main/resources/requestmap/java_ai.json
@@ -461,6 +461,51 @@
                ]
            }
        ]
    },
    "sys/update_order":{
        "map":{"class":"#SMTJavaAIControl", "method":"updateOrder"}, "no_shrio":false,
        "swaggers":[
            {
                "tags" : ["修改工单内容"],
                "title" : "修改工单内容",
                "parameters" : [
                    {"name": "title", "title": "标题", "required": false},
                    {"name": "wstypeid", "title": "类型编号", "required": false},
                    {"name": "wstypename", "title": "类型名称", "required": false},
                    {"name": "urgencylevel", "title": "紧急级别", "required": false},
                    {"name": "shape", "title": "派单坐标", "required": false},
                    {"name": "deadline", "title": "处理时限", "required": false},
                    {"name": "stepstatus", "title": "工单进度状态", "required": false},
                    {"name": "originatetypetext", "title": "来源类型", "required": false},
                    {"name": "content", "title": "内容", "required": false},
                    {"name": "address", "title": "地址", "required": false},
                    {"name": "stepid", "title": "工单步骤", "required": false},
                    {"name": "org", "title": "所属分公司", "required": false},
                    {"name": "deptname", "title": "工单所属部门名称", "required": false},
                    {"name": "dealtime", "title": "处理时间", "required": false},
                    {"name": "username", "title": "用户名称", "required": false},
                    {"name": "contactname", "title": "联系人", "required": false},
                    {"name": "contactphone", "title": "联系电话", "required": false},
                    {"name": "acceptuserid", "title": "接单人id", "required": false},
                    {"name": "acceptusername", "title": "接单人名称", "required": false},
                    {"name": "acceptuseraccount", "title": "接单人账号", "required": false},
                    {"name": "dealuserid", "title": "处理人id", "required": false},
                    {"name": "dealusername", "title": "处理人名称", "required": false},
                    {"name": "dealuseraccount", "title": "处理人账号", "required": false},
                    {"name": "flowstatus", "title": "工单状态", "required": false},
                    {"name": "attachment", "title": "附件", "required": false},
                    {"name": "creator", "title": "创建人", "required": false},
                    {"name": "createtime", "title": "创建时间", "required": false},
                    {"name": "isplan", "title": "是否计划工单", "required": false},
                    {"name": "originateid", "title": "来源编号", "required": false},
                    {"name": "appointstarttime", "title": "预约开始时间", "required": false},
                    {"name": "appointendtime", "title": "预约结束时间", "required": false},
                    {"name": "parentid", "title": "父级编号", "required": false},
                    {"name": "relateids", "title": "关联编号", "required": false},
                    {"name": "orderId", "title": "工单id", "required": true}
                ]
            }
        ]
    }
JAVA/SMTServlet/src/main/java/com/smtservlet/exception/SMTControlExceptionResolver.java
@@ -45,13 +45,13 @@
                HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            
            if(request.getMethod().equalsIgnoreCase("GET"))
            {
                response.setCharacterEncoding("UTF-8");
                response.setContentType("text/html;charset=UTF-8");
                response.getOutputStream().write(_msg.getBytes("UTF-8"));
            }
            else
//            if(request.getMethod().equalsIgnoreCase("GET"))
//            {
//                response.setCharacterEncoding("UTF-8");
//                response.setContentType("text/html;charset=UTF-8");
//                response.getOutputStream().write(_msg.getBytes("UTF-8"));
//            }
//            else
            {
                if(_url != null)
                {