ShuanghongS 6 months ago
parent
commit
0ddefc21e6
3 changed files with 149 additions and 21 deletions
  1. 3 0
      service/column.class.php
  2. 47 21
      service/robot.class.php
  3. 99 0
      utils/utils.class.php

+ 3 - 0
service/column.class.php

@@ -295,6 +295,9 @@ class column {
         if ($type == "Operation_Search"){
             return array("operation_time" =>array("formatter" =>"dateTime"));
         }
+        if ($type == "Robot_Chat_Search"){
+            return array("question_date" =>array("formatter" =>"dateTime"));
+        }
     }
 
     /**

+ 47 - 21
service/robot.class.php

@@ -31,19 +31,14 @@ class robot{
         $operate = utils::_get('operate');
         $operate = strtolower($operate);
 
-        /*
-         * index page
-         */
         if (empty($operate)) {
             $column = column::getInstance()->getDisplayColumn('Robot_Chat_Search');
-            $OperationTableColumns = column::getInstance()->tableColumns('Operation_Search',$column);
+            $OperationTableColumns = column::getInstance()->tableColumns('Robot_Chat_Search',$column);
             $data['OperationTableColumns'] = $OperationTableColumns;
             common::echo_json_encode(200,$data);
             exit();
         }
-        /*
-         * operation_search search
-         */
+
         if ($operate == "search") {
             //$this->_operation_search();
         }
@@ -269,14 +264,51 @@ class robot{
             $request_content = common::check_input(json_encode($response['data']));
             $ai_response_content = common::check_input(json_encode($response['full_response']));
             $output_token = common::check_input($output_token);
-  
+
+            $answer_template = "";
+            $message = json_decode(common::getChatAimessage($response['message']),true);
+            if($message["can_query"] == "true" && !empty($message["sql"])){
+                $reference = $message["reference"];
+                $answer_template = common::check_input($message["reference"]);
+                $sql = $message["sql"];
+                //拆分sql 存在多条的情况
+                $sqlArr = explode(";", $sql);
+                //给所有sql 拼接用户权限
+                $sqlWhere = '  ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
+                //先不考虑总数,处理有难度
+                foreach($sqlArr as $_sql){
+                    if(empty($_sql)){
+                        continue;
+                    }
+                    //根据public.kln_ocean 和 WHERE 的位置关系,带入权限
+                    $new_sql = utils::modifyString($_sql,$sqlWhere);
+                    //处理limit 超过10 先限制10
+                    $new_sql = utils::processLimitClause($new_sql);
+                    $rs = common::excuteListSql($new_sql);
+                    $reference = utils::replacementsMultiline($rs,$reference);
+                }
+                //有就去掉{{#each hbol_list}}\n  {{/each}}
+                $reference = preg_replace([
+                    '/\{\{[^}]+\}\}\n/',  // 匹配开始标签及换行
+                    '/\{\{\/[^}]+\}\}/'   // 匹配结束标签
+                ], '', $reference);
+
+                //$reference = $reference.$message["reference"];
+                $answer = $reference;
+                //$response['message'] = json_decode(common::getChatAimessage($response['message']),true);
+                //$answer = $response;
+            }else{
+                $answer = $message["response"];
+            }
+
+            //最后插入数据
             $sql = "INSERT INTO public.kln_robot_chat_log( question_id, user_name, user_type, question_type, question_content, 
-                        answer_type, answer, answer_satisfication, answer_duration, question_date, 
+                        answer_type, answer, answer_satisfication, answer_duration,answer_template, question_date, 
                         question_time, request_id, ai_model, request_content, input_token, 
                         ai_response_content, output_token, request_time, response_time, 
                         response_duration)
                 VALUES ('$question_id', '$user_name', '$user_type', '$question_type', '$question_content', 
-                        '$answer_type', '$answer', '', '$response_duration', '$request_question_time', 
+                        '$answer_type', '".common::check_input($answer)."', '', '$response_duration','$answer_template','$request_question_time', 
                         '$question_time', '$request_id', '$ai_model','$request_content',  '$input_token', 
                         '$ai_response_content', '$output_token', '$request_question_time', '$response_time', 
                         '$response_duration');";
@@ -285,21 +317,15 @@ class robot{
                 $data = array("msg" => "AI Chat Save Error");
                 common::echo_json_encode(200,$data);
                 exit();
-            } 
-            error_log($response['message']);    
-            // $sql ="";
-            // //用户权限
-            // $sqlWhere = ' and  ' . common::searchExtendHand_KLN("ocean", $_SESSION["ONLINE_USER"]);
-            // $sql .= $sqlWhere;
-            // $rs = common::excuteListSql($sql);
-            $response['message'] = json_decode(common::getChatAimessage($response['message']),true);
-            $rs = $response;
-            common::echo_json_encode(200,$rs);            
+            }
+
+            $return = array("type"=>"markdown","data" =>$answer);
+            common::echo_json_encode(200,$return);            
             exit(); 
         }
 
         if ($operate == "download"){
-            $sql = common::deCode($_POST ['tmp_search'], 'D');
+            $sql = common::deCode($_REQUEST['tmp_search'], 'D');
             if(!empty($sql)){
                 $rs = common::excuteListSql($sql);
             }

+ 99 - 0
utils/utils.class.php

@@ -879,5 +879,104 @@ class utils {
 
         return $array;
     }
+    /**
+     * public.kln_ocean 和 WHERE 的位置关系,进行条件拼接
+    */
+    public static function modifyString($input,$sqlWhere) {
+        $search = 'public.kln_ocean';
+        $pos = strpos($input, $search);
+        
+        if ($pos !== false) {
+            $afterSearch = substr($input, $pos + strlen($search));
+            $hasWhere = (stripos($afterSearch, 'WHERE') !== false);
+            
+            if ($hasWhere) {
+                // 在 WHERE 后插入 1=1
+                $wherePos = stripos($input, 'WHERE', $pos);
+                $insertPos = $wherePos + strlen('WHERE');
+                $sqlWhere =' ' .$sqlWhere.' and  ';
+                return substr_replace($input, $sqlWhere, $insertPos, 0);
+            } else {
+                // 在 public.kln_ocean 后插入 1=1
+                $insertPos = $pos + strlen($search);
+                $sqlWhere =' where ' .$sqlWhere.' ';
+                return substr_replace($input, $sqlWhere, $insertPos, 0);
+            }
+        }
+        return $input;
+    }
+
+    /**
+     * LIMIT的处理,或者超过10
+     */
+    public static function processLimitClause($sql) {
+        // 查找不区分大小写的 LIMIT 位置
+        $limitPos = stripos($sql, 'LIMIT');
+        
+        if ($limitPos !== false) {
+            // 截取 LIMIT 之前的部分,拼接固定内容
+            $processed = substr($sql, 0, $limitPos) . 'LIMIT 10';
+        } else {
+            // 无 LIMIT 时直接追加
+            $processed = $sql . ' LIMIT 10';
+        }
+        
+        return $processed;
+    }
+
+    /**
+     * 替换 single reference
+    */
+    public static function replacements($data, $template) {
+        // 动态构建替换数组(格式:[key] => value)
+        $replacements = [];
+        foreach ($data as $key => $value) {
+            $replacements["{$key}"] = $value; // 将键名包裹在方括号中
+            $replacements["{{$key}}"] = $value; 
+            $replacements["{{{$key}}}"] = $value; 
+        }
+        // 执行替换
+        $result = strtr($template, $replacements);
+        // 输出结果
+        return $result;
+    }
+
+     /**
+     * 替换复杂的reference
+    */
+    public static function replacementsMultiline($data, $template) {
+        //| {{h_bol}} | {{m_bol}} | {{transport_mode}} | {{service}} | 格式
+        $replaceTemplate = "";
+        $explode_str = "|";
+        foreach($data as $key => $val){
+            if($key == 0){
+                foreach($val as $field => $fieldVal){
+                    $explode_str.=" {{{$field}}} |";
+                }
+            }else{
+                continue;
+            }
+        }
+        //检查模板 是否已经带有特定表格的序列
+        if(strpos($template, $explode_str) !== false){
+            $parts = explode("$explode_str", $template,2); 
+
+            // 生成所有行
+            $generatedRows = [];
+            foreach ($data as $row) {
+                $replacements = [];
+                foreach ($row as $key => $value) {
+                    $replacements["{{{$key}}}"] = $value;
+                }
+                $generatedRows[] = strtr($explode_str, $replacements);
+            }
+            $replaceTemplate = $parts[0] . implode("\n", $generatedRows) . $parts[1];
+        }else{
+            //全文替换 上面统一有excuteListSql 这里的结果要变一下
+            $replaceTemplate = utils::replacements($data[0],$template);
+        }
+        return $replaceTemplate;
+    }
+
 }
 ?>