DataFormat组件

DataFormat组件主要提供数据处理服务,比如聚合、拼接关联数据等。

功能描述

动作

描述

使用场景

joindata

将多张表进行join连接,并将指定的字段进行输出。

两张表或者多张表根据某个key进行join连接。

groupbydata

将输入的数据根据某个key进行分组。

array进行分组。

concatFiledtoBatch

将输入的数据的value进行分批拼接,可以添加前缀、后缀、间隔字符串。

array中的内容需要拼接。

leftJoin

以左节点为主表进行join左连接,并输出指定的字段。

join时需要保留左节点所有数据,不需要右节点的无关数据。

convertToJson

将字符串转为JSON。

字符串转JSON。

uniondata

把多个行数据组合在一起,也就是把多个JSONObject放在一起形成新的JSONArray。

多个JSON转为一个JSONArray。

formatdata

对数据做转换,同时会产生一个新的表。

数据转换或者聚合多个数据到一张表中。

组件配置示例

本文提供了DataFormat组件各动作的参数配置示例,您可将其作为测试剧本导入。通过可视化流程编辑器,能更直观地了解和测试各动作的配置参数,轻松掌握组件的功能逻辑与使用方式。操作步骤可参考剧本导入

说明

请先将示例数据保存为JSON文件。

{
  "cells": [
    {
      "position": {
        "x": -510,
        "y": 20
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "label": {
          "text": "",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        },
        "path": {
          "stroke": "#63ba4d"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "StartEvent_1",
      "zIndex": 1,
      "data": {
        "nodeType": "startEvent",
        "appType": "basic",
        "valueData": {

        },
        "icon": "icon-circle"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "position": {
        "x": -110,
        "y": 5
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "8d42d64a-fb1a-41fe-aeeb-000849b57892",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "leftJoin",
        "valueData": {
          "leftNode": "[{\"action\":\"11\",\"uuid\":[{\"uuid-key\":\"1\"}]},{\"action\":\"21\",\"uuid\":[{\"uuid-key\":\"2\"}]}]",
          "rightNode": "[{\"uuid\":[{\"uuid-key\":\"1\"}],\"host\":\"196.1.*.*\"},{\"uuid\":[{\"uuid-key\":\"1\"}],\"host\":\"196.2.*.*\"}]",
          "joinFields": "[{\"fieldName\":\"leftNode.uuid\",\"fieldValue\":\"rightNode.uuid\"}]",
          "leftOutputFilelds": "[{\"fieldName\":\"*\",\"fieldValue\":\"action,uuid\"}]",
          "rightOutputFields": "[{\"fieldName\":\"站点\",\"fieldValue\":\"host\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "Left Join,关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "leftJoin",
        "cascaderValue": [],
        "status": "success"
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "17bbdf75-e724-4c63-a055-e184bf946b87",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "8d42d64a-fb1a-41fe-aeeb-000849b57892"
      }
    },
    {
      "position": {
        "x": 222.5,
        "y": 10
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "957ea6d3-2562-4f0f-829e-f3613f9e1f16",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "ada87a01-f8ff-4222-b33d-c42e3367ff47",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "8d42d64a-fb1a-41fe-aeeb-000849b57892"
      },
      "target": {
        "cell": "957ea6d3-2562-4f0f-829e-f3613f9e1f16"
      },
      "vertices": []
    },
    {
      "position": {
        "x": -310,
        "y": 110
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "7309e77a-0c93-4396-b28b-9b0c1672cd4e",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "leftJSON",
        "valueData": {
          "inputData": "[{\"action\":\"11\",\"uuid\":[{\"uuid-key\":\"1\"}]},{\"action\":\"21\",\"uuid\":[{\"uuid-key\":\"2\"}]}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把输入数据转换为JSON类型的。如果是JSONArray,则把所有的数组直接放到datalist中。如果是JSONObject,则作为datalist的一行数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "convertToJSON",
        "status": "success"
      },
      "isNode": true
    },
    {
      "position": {
        "x": -68,
        "y": 110
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "e3134166-6d6c-4879-846b-a9b00ad6c4a6",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "rightJSON",
        "valueData": {
          "inputData": "[{\"uuid\":[{\"uuid-key\":\"1\"}],\"host\":\"196.1.*.*\"},{\"uuid\":[{\"uuid-key\":\"1\"}],\"host\":\"196.2.*.*\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把输入数据转换为JSON类型的。如果是JSONArray,则把所有的数组直接放到datalist中。如果是JSONObject,则作为datalist的一行数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "convertToJSON",
        "cascaderValue": [
          {
            "label": "leftJSON",
            "value": "${leftJSON}",
            "children": [
              {
                "label": "leftJSON.total_data",
                "name": "leftJSON.total_data",
                "value": "${leftJSON.total_data}"
              },
              {
                "label": "leftJSON.status",
                "name": "leftJSON.status",
                "value": "${leftJSON.status}"
              },
              {
                "label": "leftJSON.total_exe",
                "name": "leftJSON.total_exe",
                "value": "${leftJSON.total_exe}"
              },
              {
                "label": "leftJSON.datalist.*.uuid.*.uuid-key",
                "name": "leftJSON.datalist.*.uuid.*.uuid-key",
                "value": "${leftJSON.datalist.*.uuid.*.uuid-key}"
              },
              {
                "label": "leftJSON.total_data_successful",
                "name": "leftJSON.total_data_successful",
                "value": "${leftJSON.total_data_successful}"
              },
              {
                "label": "leftJSON.total_data_with_dup",
                "name": "leftJSON.total_data_with_dup",
                "value": "${leftJSON.total_data_with_dup}"
              },
              {
                "label": "leftJSON.total_exe_successful",
                "name": "leftJSON.total_exe_successful",
                "value": "${leftJSON.total_exe_successful}"
              },
              {
                "label": "leftJSON.datalist.*.action",
                "name": "leftJSON.datalist.*.action",
                "value": "${leftJSON.datalist.*.action}"
              }
            ]
          }
        ],
        "status": "success"
      },
      "isNode": true
    },
    {
      "position": {
        "x": 172,
        "y": 110
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "0ac43fe1-2031-4b6e-a883-d788c603e944",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "joindata",
        "valueData": {
          "inputNodes": "[{\"fieldName\":\"leftJSON\",\"fieldValue\":\"${JSONArray:leftJSON.datalist.*}\"},{\"fieldName\":\"rightJSON\",\"fieldValue\":\"${JSONArray:rightJSON.datalist.*}\"}]",
          "joinFields": "[{\"fieldName\":\"leftJSON.uuid\",\"fieldValue\":\"rightJSON.uuid\"}]",
          "outputFields": "[{\"fieldName\":\"myhost\",\"fieldValue\":\"rightJSON.host\"},{\"fieldName\":\"myaction\",\"fieldValue\":\"leftJSON.action\"},{\"fieldName\":\"uuid\",\"fieldValue\":\"leftJSON.uuid\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "提供类似多表JOIN的语法,以逗号分割,对处理节点的datalist.*的数据当作多长多列的数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "joindata",
        "cascaderValue": [
          {
            "label": "rightJSON",
            "value": "${rightJSON}",
            "children": [
              {
                "label": "rightJSON.total_data_with_dup",
                "name": "rightJSON.total_data_with_dup",
                "value": "${rightJSON.total_data_with_dup}"
              },
              {
                "label": "rightJSON.total_data",
                "name": "rightJSON.total_data",
                "value": "${rightJSON.total_data}"
              },
              {
                "label": "rightJSON.status",
                "name": "rightJSON.status",
                "value": "${rightJSON.status}"
              },
              {
                "label": "rightJSON.datalist.*.host",
                "name": "rightJSON.datalist.*.host",
                "value": "${rightJSON.datalist.*.host}"
              },
              {
                "label": "rightJSON.total_exe_successful",
                "name": "rightJSON.total_exe_successful",
                "value": "${rightJSON.total_exe_successful}"
              },
              {
                "label": "rightJSON.datalist.*.uuid.*.uuid-key",
                "name": "rightJSON.datalist.*.uuid.*.uuid-key",
                "value": "${rightJSON.datalist.*.uuid.*.uuid-key}"
              },
              {
                "label": "rightJSON.total_data_successful",
                "name": "rightJSON.total_data_successful",
                "value": "${rightJSON.total_data_successful}"
              },
              {
                "label": "rightJSON.total_exe",
                "name": "rightJSON.total_exe",
                "value": "${rightJSON.total_exe}"
              }
            ]
          },
          {
            "label": "leftJSON",
            "value": "${leftJSON}",
            "children": [
              {
                "label": "leftJSON.total_data",
                "name": "leftJSON.total_data",
                "value": "${leftJSON.total_data}"
              },
              {
                "label": "leftJSON.status",
                "name": "leftJSON.status",
                "value": "${leftJSON.status}"
              },
              {
                "label": "leftJSON.total_exe",
                "name": "leftJSON.total_exe",
                "value": "${leftJSON.total_exe}"
              },
              {
                "label": "leftJSON.datalist.*.uuid.*.uuid-key",
                "name": "leftJSON.datalist.*.uuid.*.uuid-key",
                "value": "${leftJSON.datalist.*.uuid.*.uuid-key}"
              },
              {
                "label": "leftJSON.total_data_successful",
                "name": "leftJSON.total_data_successful",
                "value": "${leftJSON.total_data_successful}"
              },
              {
                "label": "leftJSON.total_data_with_dup",
                "name": "leftJSON.total_data_with_dup",
                "value": "${leftJSON.total_data_with_dup}"
              },
              {
                "label": "leftJSON.total_exe_successful",
                "name": "leftJSON.total_exe_successful",
                "value": "${leftJSON.total_exe_successful}"
              },
              {
                "label": "leftJSON.datalist.*.action",
                "name": "leftJSON.datalist.*.action",
                "value": "${leftJSON.datalist.*.action}"
              }
            ]
          }
        ],
        "status": "success"
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "a6f70a6a-f5a0-4e5c-9de5-5230dc1deefa",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "router": {
        "name": "normal"
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "7309e77a-0c93-4396-b28b-9b0c1672cd4e"
      },
      "vertices": [
        {
          "x": -492,
          "y": 143
        }
      ]
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "13db0fe6-495d-4b16-80ca-df96d33beff1",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "7309e77a-0c93-4396-b28b-9b0c1672cd4e"
      },
      "target": {
        "cell": "e3134166-6d6c-4879-846b-a9b00ad6c4a6"
      }
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "9f472b01-bb53-4bac-a8dd-a67c3c537fa9",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "e3134166-6d6c-4879-846b-a9b00ad6c4a6"
      },
      "target": {
        "cell": "0ac43fe1-2031-4b6e-a883-d788c603e944"
      }
    },
    {
      "position": {
        "x": 440,
        "y": 110
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "a66c2f32-7d29-40a2-8e7e-622f09cf23dd",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "caf56653-94c8-42f8-beec-f4deb72dc93f",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "0ac43fe1-2031-4b6e-a883-d788c603e944"
      },
      "target": {
        "cell": "a66c2f32-7d29-40a2-8e7e-622f09cf23dd"
      }
    },
    {
      "position": {
        "x": -310,
        "y": 262
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "83110da4-c8e7-4d19-8e79-51f8903625b2",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "mockData",
        "valueData": {
          "inputData": "[{\"攻击类型\":\"网站后门\",\"count\":\"1\",\"startTime\":\"1646115503000\",\"endTime\":\"1646115503000\",\"securityEventIds\":\"330706\"},{\"攻击类型\":\"网站后门\",\"count\":\"1\",\"startTime\":\"1646114346000\",\"endTime\":\"1646114346000\",\"securityEventIds\":\"330700\"},{\"攻击类型\":\"应用白名单\",\"count\":\"1\",\"startTime\":\"1646114098000\",\"endTime\":\"1646114098000\",\"securityEventIds\":\"330699\"},]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把输入数据转换为JSON类型的。如果是JSONArray,则把所有的数组直接放到datalist中。如果是JSONObject,则作为datalist的一行数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "convertToJSON",
        "status": "success"
      },
      "isNode": true
    },
    {
      "position": {
        "x": -80,
        "y": 262
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "5314c487-af24-4dbf-bc11-f79bed39b60b",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "groupbydata",
        "valueData": {
          "inputNode": "${JSONArray:mockData.datalist.*}",
          "groupByKeys": "攻击类型",
          "outputFields": "[{\"fieldName\":\"攻击次数\",\"fieldType\":\"jq\",\"fieldValue\":\".datalist | map_values(.count)|add|length\"},{\"fieldName\":\"最新攻击时间\",\"fieldType\":\"jq\",\"fieldValue\":\"[.datalist[].endTime|tonumber]|max\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "对某个数据源做聚合操作",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "groupbydata",
        "status": "success"
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "e0ac28e4-a693-4c24-aad6-e56349468ecc",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "router": {
        "name": "normal"
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "83110da4-c8e7-4d19-8e79-51f8903625b2"
      },
      "vertices": [
        {
          "x": -492,
          "y": 295
        }
      ]
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "a555fddb-9eb9-48f8-8d01-836537104767",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "83110da4-c8e7-4d19-8e79-51f8903625b2"
      },
      "target": {
        "cell": "5314c487-af24-4dbf-bc11-f79bed39b60b"
      }
    },
    {
      "position": {
        "x": 240,
        "y": 270
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "7779ea7e-b587-4512-94e0-d00dc76251e4",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "70f8f4cc-0561-4bd8-aecd-6fa2441c0b38",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "5314c487-af24-4dbf-bc11-f79bed39b60b"
      },
      "target": {
        "cell": "7779ea7e-b587-4512-94e0-d00dc76251e4"
      }
    },
    {
      "position": {
        "x": -140,
        "y": 400
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "a6080934-1dd4-4d87-b573-1f90be7d4535",
      "zIndex": 1,
      "data": {
        "isDebug": false,
        "nodeType": "action",
        "appType": "component",
        "nodeName": "concatFieldtoBatch",
        "valueData": {
          "inputField": "[{\"攻击类型\":\"网站后门\"},{\"攻击类型\":\"网站后门\"},{\"攻击类型\":\"网站后门\"},{\"攻击类型\":\"应用白名单\"},{\"攻击类型\":\"应用白名单\"}]",
          "batchSize": "2",
          "concatStr": "\" ## \"",
          "fieldAddPrefix": "前",
          "fieldAddSuffix": "后"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把某个字段的值分割成小批次,每个批次拼接成一个字符串",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "concatFieldtoBatch",
        "status": "success",
        "cascaderValue": []
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "06606aa2-6573-4fe2-83e3-2f66bb70db76",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "router": {
        "name": "normal"
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "a6080934-1dd4-4d87-b573-1f90be7d4535"
      },
      "vertices": [
        {
          "x": -492,
          "y": 433
        }
      ]
    },
    {
      "position": {
        "x": 198,
        "y": 415
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "59bc46fa-d6cb-4e89-9107-d30216c01d2b",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "fc410d6d-ff0f-4d01-8c0b-2a2e3104d8ce",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "a6080934-1dd4-4d87-b573-1f90be7d4535"
      },
      "target": {
        "cell": "59bc46fa-d6cb-4e89-9107-d30216c01d2b"
      }
    },
    {
      "position": {
        "x": -180,
        "y": -180
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "c1fd4832-8717-44d8-9a27-dc6f45499f47",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "convertToJSON",
        "valueData": {
          "inputData": "[{\"攻击类型\":\"网站后门\"},{\"攻击类型\":\"网站后门\"},{\"攻击类型\":\"网站后门\"},{\"攻击类型\":\"应用白名单\"},{\"攻击类型\":\"应用白名单\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把输入数据转换为JSON类型的。如果是JSONArray,则把所有的数组直接放到datalist中。如果是JSONObject,则作为datalist的一行数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "convertToJSON",
        "status": "success"
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "4f498976-09d4-4550-9e73-2241077b1922",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "router": {
        "name": "normal"
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "c1fd4832-8717-44d8-9a27-dc6f45499f47"
      },
      "vertices": [
        {
          "x": -492,
          "y": -147
        }
      ]
    },
    {
      "position": {
        "x": 121,
        "y": -165
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "46a3b954-56d1-4fd2-b016-08e144390137",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "96eddfbb-e835-43e0-8d7a-df75888519fb",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "c1fd4832-8717-44d8-9a27-dc6f45499f47"
      },
      "target": {
        "cell": "46a3b954-56d1-4fd2-b016-08e144390137"
      }
    },
    {
      "position": {
        "x": 117.5,
        "y": 505
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "ec535172-836f-4e5e-9e4a-ef546f030f5d",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "uniondata",
        "valueData": {
          "inputNodes": "[{\"fieldName\":\"leftJSON\",\"fieldValue\":\"${JSONArray:left.datalist.*}\"},{\"fieldName\":\"rightJSON\",\"fieldValue\":\"${JSONArray:right.datalist.*}\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把多个上游的多行结果Union在一起",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "uniondata",
        "cascaderValue": [
          {
            "label": "right",
            "value": "${right}",
            "children": [
              {
                "label": "right.total_data_with_dup",
                "name": "right.total_data_with_dup",
                "value": "${right.total_data_with_dup}"
              },
              {
                "label": "right.total_data_successful",
                "name": "right.total_data_successful",
                "value": "${right.total_data_successful}"
              },
              {
                "label": "right.status",
                "name": "right.status",
                "value": "${right.status}"
              },
              {
                "label": "right.total_data",
                "name": "right.total_data",
                "value": "${right.total_data}"
              },
              {
                "label": "right.datalist.*.uuid.*.uuid-key",
                "name": "right.datalist.*.uuid.*.uuid-key",
                "value": "${right.datalist.*.uuid.*.uuid-key}"
              },
              {
                "label": "right.total_exe",
                "name": "right.total_exe",
                "value": "${right.total_exe}"
              },
              {
                "label": "right.total_exe_successful",
                "name": "right.total_exe_successful",
                "value": "${right.total_exe_successful}"
              },
              {
                "label": "right.datalist.*.host",
                "name": "right.datalist.*.host",
                "value": "${right.datalist.*.host}"
              }
            ]
          },
          {
            "label": "left",
            "value": "${left}",
            "children": [
              {
                "label": "left.total_data",
                "name": "left.total_data",
                "value": "${left.total_data}"
              },
              {
                "label": "left.total_exe_successful",
                "name": "left.total_exe_successful",
                "value": "${left.total_exe_successful}"
              },
              {
                "label": "left.status",
                "name": "left.status",
                "value": "${left.status}"
              },
              {
                "label": "left.datalist.*.action",
                "name": "left.datalist.*.action",
                "value": "${left.datalist.*.action}"
              },
              {
                "label": "left.datalist.*.uuid.*.uuid-key",
                "name": "left.datalist.*.uuid.*.uuid-key",
                "value": "${left.datalist.*.uuid.*.uuid-key}"
              },
              {
                "label": "left.total_exe",
                "name": "left.total_exe",
                "value": "${left.total_exe}"
              },
              {
                "label": "left.total_data_with_dup",
                "name": "left.total_data_with_dup",
                "value": "${left.total_data_with_dup}"
              },
              {
                "label": "left.total_data_successful",
                "name": "left.total_data_successful",
                "value": "${left.total_data_successful}"
              }
            ]
          }
        ],
        "status": "success"
      },
      "isNode": true
    },
    {
      "position": {
        "x": 400,
        "y": 520
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "598f44e2-1582-486f-95f2-23fba92d9486",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "4a22f5d7-d8a1-416b-9969-019f530902f6",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "ec535172-836f-4e5e-9e4a-ef546f030f5d"
      },
      "target": {
        "cell": "598f44e2-1582-486f-95f2-23fba92d9486"
      }
    },
    {
      "position": {
        "x": -210,
        "y": 610
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "7de7117c-1da6-4d03-8a09-b761114a7b05",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "formatdata",
        "valueData": {
          "outputFields": "[{\"fieldName\":\"name\",\"fieldValue\":\"test\"},{\"fieldName\":\"age\",\"fieldValue\":\"18\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "产生一个新的数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "formatdata",
        "status": "success",
        "cascaderValue": [],
        "isDebug": false
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "4136040c-0b42-4557-94bb-8b77b6f5f3c5",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "router": {
        "name": "normal"
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "7de7117c-1da6-4d03-8a09-b761114a7b05"
      },
      "vertices": [
        {
          "x": -492,
          "y": 643
        }
      ]
    },
    {
      "position": {
        "x": 71,
        "y": 625
      },
      "size": {
        "width": 36,
        "height": 36
      },
      "attrs": {
        "body": {
          "fill": "white",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 2
        },
        "path": {
          "r": 12,
          "refX": "50%",
          "refY": "50%",
          "fill": "#63ba4d",
          "strokeOpacity": 0.95,
          "stroke": "#63ba4d",
          "strokeWidth": 4
        },
        "label": {
          "text": "结束",
          "fontSize": 12,
          "refX": 0.5,
          "refY": "100%",
          "refY2": 4,
          "textAnchor": "middle",
          "textVerticalAnchor": "top"
        }
      },
      "visible": true,
      "shape": "circle",
      "id": "8978b5d1-3cae-4e43-98d0-aca302555856",
      "zIndex": 1,
      "data": {
        "nodeType": "endEvent",
        "appType": "basic",
        "nodeName": "结束",
        "icon": "icon-radio-off-full",
        "description": "剧本结束节点"
      },
      "markup": [
        {
          "tagName": "circle",
          "selector": "body"
        },
        {
          "tagName": "circle",
          "selector": "path"
        },
        {
          "tagName": "text",
          "selector": "label"
        }
      ],
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "fe238014-7582-4482-b9d4-cf20cbc40e53",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "7de7117c-1da6-4d03-8a09-b761114a7b05"
      },
      "target": {
        "cell": "8978b5d1-3cae-4e43-98d0-aca302555856"
      }
    },
    {
      "position": {
        "x": -380,
        "y": 500
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "b300fedc-d828-413c-b593-153dbda5ed1a",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "left",
        "valueData": {
          "inputData": "[{\"action\":\"11\",\"uuid\":[{\"uuid-key\":\"1\"}]},{\"action\":\"21\",\"uuid\":[{\"uuid-key\":\"2\"}]}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把输入数据转换为JSON类型的。如果是JSONArray,则把所有的数组直接放到datalist中。如果是JSONObject,则作为datalist的一行数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "convertToJSON",
        "status": "success"
      },
      "isNode": true
    },
    {
      "position": {
        "x": -80,
        "y": 505
      },
      "size": {
        "width": 137,
        "height": 66
      },
      "view": "react-shape-view",
      "shape": "activity",
      "id": "c5baaffa-df7e-47f4-851d-7289276ad76b",
      "zIndex": 1,
      "data": {
        "nodeType": "action",
        "appType": "component",
        "nodeName": "right",
        "valueData": {
          "inputData": "[{\"uuid\":[{\"uuid-key\":\"1\"}],\"host\":\"196.1.*.*\"},{\"uuid\":[{\"uuid-key\":\"1\"}],\"host\":\"196.2.*.*\"}]"
        },
        "icon": "https://sophon-gen-v2.oss-cn-zhangjiakou.aliyuncs.com/componentUpload/1719222281702_DataFormat_logo.png?Expires=1745373374&OSSAccessKeyId=STS.NVCS************&Signature=NG4Wh%2F2zJrendn8IhShW74ymMSA%3D&security-token=CAIS2AJ1q6Ft5B2yfSjIr5X2GMPAo6xY7venWBWHjlgyQexrpZTB1Dz2IHhMenFpAegcv%2Fw%2BlGFZ6%2F8elrp6SJtIXleCZtF94oxN9h2gb4fb4xF6LjaJ0s%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0OP3AOrlrBN%2Bdiuf8T9NvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onDWwAJu0%2FXa7uEo4wydVNjFbM9A65Dqufxn%2Fpgt%2Braj4X7xhhEIOVJSSPbSZBbSxJNvU1RXDxQVcEYWxylurjnXvF%2BA9Gz5Y%2FUGin%2B2svzhw6RGJ1dq8DgINtD0jokjPndRVbLXs84nxS7gbsGn76oY2zradH%2FdU501DLSMytAXxqAAYnrQLesLZ0VOxi7cg9LDO9w1brCl%2Fw1TxYuVpiYFJ11Kc5F2ues4ocueMk3q3AuAFpCyXW646Exz7L86%2Bp3aiLIps5ON%2FjCiP9oG8LAXI4ajG3woQPLdwm9bT20vHi4yEJYVlvntpkk5bLR5mOuE%2B6VPgmB2q2gHJTKgj13KEDwIAA%3D",
        "description": "把输入数据转换为JSON类型的。如果是JSONArray,则把所有的数组直接放到datalist中。如果是JSONObject,则作为datalist的一行数据",
        "advance": {
          "inputParamMode": false,
          "onError": "stop_cur_flow",
          "rspStatusType": 3,
          "rspStatusThreshold": 0
        },
        "componentName": "DataFormat",
        "actionName": "convertToJSON",
        "status": "success"
      },
      "isNode": true
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "a8104b42-f869-4296-9681-f67f4f59ecef",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "router": {
        "name": "normal"
      },
      "isNode": false,
      "source": {
        "cell": "StartEvent_1"
      },
      "target": {
        "cell": "b300fedc-d828-413c-b593-153dbda5ed1a"
      },
      "vertices": [
        {
          "x": -492,
          "y": 533
        }
      ]
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "c20d8dea-c711-4cc3-b6ea-f86033954390",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "b300fedc-d828-413c-b593-153dbda5ed1a"
      },
      "target": {
        "cell": "c5baaffa-df7e-47f4-851d-7289276ad76b"
      }
    },
    {
      "shape": "custom-edge",
      "attrs": {
        "line": {
          "stroke": "#63ba4d",
          "targetMarker": {
            "stroke": "#63ba4d"
          }
        }
      },
      "zIndex": 1,
      "id": "c00c6197-85b7-486b-8771-3daa3fdb243e",
      "data": {
        "nodeType": "sequenceFlow",
        "appType": "basic",
        "icon": "icon-upper-right-arrow",
        "isRequired": false
      },
      "isNode": false,
      "source": {
        "cell": "c5baaffa-df7e-47f4-851d-7289276ad76b"
      },
      "target": {
        "cell": "ec535172-836f-4e5e-9e4a-ef546f030f5d"
      }
    }
  ]
}

joindata

将多张表进行join连接,并将指定的字段进行输出。

参数说明

参数

描述

inputNodes

  • 要参与joinnode节点,数据格式JsonArray。

  • 嵌套层级没有限制,JSONArray里可再嵌套多层JSONArray。

joinFields

  • 节点连接时关联的字段,格式为[nodeName].[fieldName] 。

  • 只支持选择inputNodes中第一级的字段,且对字段的类型无限制,JSONArray、String等均支持,但不能选择嵌套的JSONArray里的字段。

    说明

    例如若inputNodes数据为[{"action":"11","uuid":[{"uuid-key":"1"}]],则joinFields可设置为action、uuid,而不能设置为uuid-key。

outputFields

join完成后要输出的字段,引用格式为[nodeName].[fieldName]。

示例

示例场景如下:

  • 前置数据节点分别nodeNameleftJSONrightJSON,数据格式如下:

    leftJSON:[{"action":"11","uuid":[{"uuid-key":"1"}]},{"action":"21","uuid":[{"uuid-key":"2"}]}]。

    rightJSON:[{"uuid":[{"uuid-key":"1"}],"host":"196.1.*.*"},{"uuid":[{"uuid-key":"1"}],"host":"196.2.*.*"}]。

  • 根据uuid进行关联进行join链接。

  • 输出字段配置:将rightJSONhost输出为myhost字段,leftJSONaction字段输出为myaction字段,leftJSONuuid映射为uuid字段。

参数

参数值

inputNodes

两行数据,数据配置如下:

  • 第一行

    左输入框:leftJSON,右输入框:${JSONArray:leftJSON.datalist.*}。

  • 第二行

    左输入框:rightJSON,右输入框:${JSONArray:rightJSON.datalist.*}。

说明

"JSONArray:"表示将参数进行类型转换转为JSONArray,否则无法完成拉取前置节点数据。

joinFields

左输入框:leftJSON.uuid,右输入框:rightJSON.uuid。

outputFields

三行数据,数据配置如下:

左输入框:myhost,右输入框:rightJSON.host。

左输入框:myaction,右输入框:leftJSON.action。

左输入框:uuid,右输入框:leftJSON.uuid。

示例输出结果如下:

[
    {
        "myaction": "11",
        "uuid": [
            {
                "uuid-key": "1"
            }
        ],
        "myhost": "196.1.*.*"
    },
    {
        "myaction": "11",
        "uuid": [
            {
                "uuid-key": "1"
            }
        ],
        "myhost": "196.2.*.*"
    }
]

groupbydata

将输入的数据根据某个key进行分组。

参数说明

参数

描述

inputNode

输入的内容,格式为包含多个JSONJsonArray。

groupByKeys

要分组的key值。

outputFields

分组后输出的内容,支持jq表达式。

示例

示例场景如下:

  • 输入的内容包inputNode含攻击类型、攻击次数count、endTime等信息。

  • 分组字段为攻击类型。配置:

  • 输出字段配置:count相加输出为攻击次数,选择最近的endTime输出我为最新攻击时间。

参数

参数值

inputNode

[
    {
        "攻击类型": "网站后门",
        "count": "1",
        "startTime": "1646115503000",
        "endTime": "1646115503000",
        "securityEventIds": "330706"
    },
    {
        "攻击类型": "网站后门",
        "count": "2",
        "startTime": "1646114346000",
        "endTime": "1646114346000",
        "securityEventIds": "330700"
    },
    {
        "攻击类型": "应用白名单",
        "count": "1",
        "startTime": "1646114098000",
        "endTime": "1646114098000",
        "securityEventIds": "330699"
    }
]

groupByKeys

攻击类型

outputFields

说明

使用jq表达式处理inputNode输入JSON数据:

  • “".datalist | map_values(.count)|add|length”:count串攻击次数相加。

  • “[.datalist[].endTime|tonumber]|max”:转化成数字并取最大值即获取最新攻击时间。

[
    {
        "fieldName": "攻击次数",
        "fieldType": "jq",
        "fieldValue": ".datalist | map_values(.count)|add|length"
    },
    {
        "fieldName": "最新攻击时间",
        "fieldType": "jq",
        "fieldValue": "[.datalist[].endTime|tonumber]|max"
    }
]

示例输出结果如下

[
    {
        "攻击类型": "网站后门",
        "攻击次数": 2,
        "最新攻击时间": 1646115503000
    },
    {
        "攻击类型": "应用白名单",
        "攻击次数": 1,
        "最新攻击时间": 1646114098000
    }
]

concatFiledtoBatch

对输入数据中的value进行分批拼接。

参数说明

参数

描述

inputField

要拼接的内容,格式为包含多个JSONJsonArray。

batchSize

批量拼接的数量,如2表示 2JSON拼成一个;-1表示所有拼成一个。

concatStr

拼接符,如果拼接符需要前后有空格,可以用双引号进行包括,此时不会忽略空格。如:" ## "

fieldAddPrefix

拼接后加的前缀。

fieldAddSuffix

拼接后加的后缀。

示例

示例场景如下

将输入字段(inputField)中的攻击类型,按每两条一组进行拼接,每组数据使用" ## "连接,并为每组结果添加统一前缀"前"和后缀"后"

参数

参数值

inputField

[
    {
        "攻击类型": "网站后门"
    },
    {
        "攻击类型": "网站后门"
    },
    {
        "攻击类型": "网站后门"
    },
    {
        "攻击类型": "应用白名单"
    },
    {
        "攻击类型": "应用白名单"
    }
]

batchSize

2

concatStr

" ## "

fieldAddPrefix

fieldAddSuffix

示例输出结果如下:

[
  {
    "concatField": "前网站后门后\" ## \"前网站后门后"
  },
  {
    "concatField": "前网站后门后\" ## \"前应用白名单后"
  },
  {
    "concatField": "前应用白名单后"
  }
]

leftJoin

以左节点为主表进行join左连接。

参数说明

参数

描述

leftNode

  • 参与join的左节点,格式为包含多个JSONJsonArray对象。

  • 嵌套层级没有限制,JSONArray里可再嵌套多层JSONArray。

rightNode

  • 参与join的右节点,格式为包含多个JSONJsonArray对象。

  • 嵌套层级没有限制,JSONArray里可再嵌套多层JSONArray。

joinFields

  • 节点连接时关联的字段,格式为leftNode.[fieldName] ,rightNode.[fieldName]。

  • 只支持选择leftNode中第一级的字段,且对字段的类型无限制,JSONArray、String等均支持,但不能选择嵌套的JSONArray里的字段。

    说明

    例如若leftNode数据为[{"action":"11","uuid":[{"uuid-key":"1"}]],则joinFields可设置为action、uuid,而不能设置为uuid-key。

leftOutputFilelds

左节点要输出的字段,支持key转换。左侧配置框为新名称,右侧配置矿为原始字段。

说明
  • 左右两侧输入框都支持*,左侧为*表示不做key的转换,右侧为*表示选取所有的字段。

  • 多个字段通过逗号“,”分割。

rightOutputFields

右节点要输出的字段,支持key转换。支持名称key转换。左侧配置框为新名称,右侧配置矿为原始字段。

说明
  • 左右两侧输入框都支持*,左侧为*表示不做key的转换,右侧为*表示选取所有的字段。

  • 多个字段通过逗号“,”分割。

示例

示例场景如下:

  • leftNode包含action、uuid(包含嵌套数据uuid-key),rightNode包含uuid、host。

  • leftNodeuuid作为连接字段。

  • 输出数据:leftNode输出action、uuidvalue值,不改变key名称,rightNode输出hostvalue值并更名为“站点”。

参数

参数值

leftNode

说明

以下数据需要先做类型转换,转为JsonArray对象类型

[
    {
        "action": "11",
        "uuid": [
            {
                "uuid-key": "1"
            }
        ]
    },
    {
        "action": "21",
        "uuid": [
            {
                "uuid-key": "2"
            }
        ]
    }
]

rightNode

说明

以下数据需要先做类型转换,转为JsonArray对象类型

[
    {
        "uuid": [
            {
                "uuid-key": "1"
            }
        ],
        "host": "196.1.*.*"
    },
    {
        "uuid": [
            {
                "uuid-key": "1"
            }
        ],
        "host": "196.2.*.*"
    }
]

joinFields

左输入框:leftNode.uuid,右输入框:rightNode.uuid。

leftOutputFilelds

左输入框:*,右输入框:action,uuid。

rightOutputFields

左输入框:站点,右输入框:host。

示例输出结果如下:

[
  {
    "action": "11",
    "uuid": [
      {
        "uuid-key": "1"
      }
    ],
    "站点": "196.1.*.*"
  },
  {
    "action": "11",
    "uuid": [
      {
        "uuid-key": "1"
      }
    ],
    "站点": "196.2.*.*"
  },
  {
    "action": "21",
    "uuid": [
      {
        "uuid-key": "2"
      }
    ]
  }
]

convertToJson

将传入的JSON字符串转为JSON对象,仅做类型转换。

  • 如果是JSONArray,则把所有的数组直接放到datalist中。

  • 如果是JSONObject,则作为datalist的一行数据。

uniondata

把多个行数据组合在一起。

参数说明

参数

描述

inputNodes

参与组合的节点数据。

示例

示例说明如下

前置数据节点分别nodeNameleftright,数据格式如下:

left:[{"action":"11","uuid":[{"uuid-key":"1"}]},{"action":"21","uuid":[{"uuid-key":"2"}]}]。

right:[{"uuid":[{"uuid-key":"1"}],"host":"196.1.*.*"},{"uuid":[{"uuid-key":"1"}],"host":"196.2.*.*"}]

参数

参数值

inputNodes

两行数据,数据配置如下:

左输入框:leftJSON,右输入框:${JSONArray:left.datalist.*}。

左输入框:rightJSON,右输入框:${JSONArray:right.datalist.*}。

说明
  • 左输入框leftJSON、rightJSON仅为标识,无实际意义。

  • "JSONArray:"表示将参数进行类型转换转为JSONArray,否则无法完成拉取前置节点数据。

示例输出结果如下:

[
    {
        "action": "11",
        "uuid": [
            {
                "uuid-key": "1"
            }
        ]
    },
    {
        "action": "21",
        "uuid": [
            {
                "uuid-key": "2"
            }
        ]
    },
    {
        "uuid": [
            {
                "uuid-key": "1"
            }
        ],
        "host": "196.1.*.*"
    },
    {
        "uuid": [
            {
                "uuid-key": "1"
            }
        ],
        "host": "196.2.*.*"
    }
]

formatdata

数据转换或者聚合多个数据

参数

参数

描述

inputNodes

需要格式化的数据节点。

示例

参数

参数值

inputNodes

两行数据,数据配置如下:

左输入框:name,右输入框:test

左输入框:age,右输入框:18

示例输出结果如下:

{
    "name": "test",
    "age": "18"
}