1. 报表(report)脚本
Mixiot报表的机制很简单,将需要的报表设计一个excel模板,然后填充数据生成实际报表。其中,如何填充数据是脚本配置的。

1.1. 报表脚本示例
{
    "工作簿1名称":[
        {
            "field":"data",
            "block_id":"apim",
            "position":{
                "to":"",
                "from":"A_1"
            },
            "sequence":"cellData",
            "condition":{
                "action":"get_last_statistics",
                "script_uid":"STATISTICS1410094400003"
            },
            "format_function":""
        },
        {
            "field":"data",
            "block_id":"apim",
            "position":{
                "to":"B_10",
                "from":"B_1"
            },
            "sequence":"columnData",
            "condition":{
                "items":10000,
                "action":"get_statistics_list",
                "end_time":"2021-06-30 00:00:00",
                "object_id":"OBJ1343477200007",
                "mapping_id":"",
                "script_uid":"",
                "start_time":"2021-03-29 00:00:00"
            },
            "format_function":""
        },
        {
            "field":"data",
            "block_id":"apim",
            "position":{
                "to":"H_1",
                "from":"C_1"
            },
            "sequence":"rowData",
            "condition":{
                "items":10000,
                "action":"get_statistics_list",
                "end_time":"2021-06-30 00:00:00",
                "object_id":"OBJ1343477200007",
                "mapping_id":"",
                "script_uid":"",
                "start_time":"2021-03-29 00:00:00"
            },
            "format_function":""
        },
        {
            "field":"id,data,created",
            "block_id":"apim",
            "position":{
                "to":"H_3,H_4,H_5",
                "from":"B_3,B_4,B_5"
            },
            "sequence":"columnTableData",
            "condition":{
                "items":10000,
                "action":"get_statistics_list",
                "end_time":"2021-06-30 00:00:00",
                "object_id":"OBJ1343477200007",
                "mapping_id":"",
                "script_uid":"",
                "start_time":"2021-03-29 00:00:00"
            },
            "format_function":""
        },
        {
            "field":"id,data,created",
            "block_id":"apim",
            "position":{
                "to":"A_18,B_18,C_18",
                "from":"A_8,B_8,C_8"
            },
            "sequence":"rowTableData",
            "condition":{
                "items":10000,
                "action":"get_statistics_list",
                "end_time":"2021-06-30 00:00:00",
                "object_id":"OBJ1343477200007",
                "mapping_id":"",
                "script_uid":"",
                "start_time":"2021-03-29 00:00:00"
            },
            "format_function":""
        }
    ]
}
1.2. 报表脚本说明
由上述脚本示例可知,json中的第一层主体格式为key-value格式;其中,key为每一个excel的工作簿(sheet)的名称,value则为需要在此工作簿中渲染的数据对象。
注:value是很多object类型数据的列表,其中,每一个object都填充自己内部声明指定的单元格,具体规则在字段解释章节进行说明
综上,如果一个模板包含多个工作簿(sheet),则数据源脚本格式应如下设置:
{
    "工作簿1名称":[
       {
            "field":"data",
            "remark":"上月数据",
            "block_id":"apim",
            "position":{
                "from":"A_1",
                "to":""
            },
            "sequence":"rowTableData",
            "condition":{
                "start":"date('Y-m-01 00:00:01',strtotime('-1 months'))",
                "end":  "date('Y-m-01 00:00:00', time())",
                "action":"get_statistics_list",
                "order_by":"[\"created\", \"asc\"]",
                "object_id":"A161205_20",
                "script_uid":"ST_ProduceSteam_Day"
            },
            "format_function":""
        }
    ],
    "工作簿2名称":[
         {
            "field":"data",
            "block_id":"apim",
            "position":{
                "from":"A_1",
                "to":""
            },
            "sequence":"rowTableData",
            "condition":{
                "action":"get_last_statistics",
                "script_uid":"STATISTICS1410094400003"
            },
            "format_function":""
        }
    ]
}
1.3. 报表脚本字段解释
我们只拿一个工作簿的字段进行具体讲解(多工作簿的脚本同理)。
1.3.1. 字段概要
每个工作簿中,每个对象的主要属性如下:
| 属性 | 说明 | 
|---|---|
| sequence | 需要渲染的单元格的格式 | 
| position | 配合sequence属性,规范起始单元格到终止单元格 | 
| format_function | 格式化函数,在自定义接口时使用,不用则可置空 | 
| condition | 请求api需要传递的参数集合 | 
| field | 需要从api返回结果解析到单元格的字段 | 
| block | 需要获取数据源的block | 
1.3.2. sequence
| 可选值 | 说明 | 
|---|---|
| cellData | 只渲染一个单元格的数据 | 
| columnData | 渲染一列单元格的数据 | 
| rowData | 渲染一行单元格的数据 | 
| columnTableData | 以列为单位,渲染一块区域单元格的数据 | 
| rowTableData | 以行为单位,渲染一块区域单元格的数据 | 
1.3.3. position
position是一个对象,只有from和to属性
- from:从哪个单元格开始,列_行,如A_2
- to: 到哪个单元格结束,列_行,如A_2
"position":{"from":"A_2","to":"A_11"}
注:这个参数是配合sequence属性选择数据范围的
| 可选值 | 说明 | position举例 | 
|---|---|---|
| sequence是cellData情况下 | 只渲染一个单元格的数据 | {"from":"A_1","to":""} | 
| sequence是columnData | 渲染一列单元格的数据 | {"from":"A_2","to":"A_11"} | 
| sequence是rowData | 渲染一行单元格的数据 | {"from":"B_2","to":"H_2"} | 
| sequence是columnTableData | 以列为单位,渲染一块区域单元格的数据 | {"from":"B_3,B_4,B_5","to":"H_3,H_4,H_5"} | 
| sequence是rowTableData | 以行为单位,渲染一块区域单元格的数据 | {"from":"A_8,B_8,C_8","to":"A_18,B_18,C_18"} | 
1.3.4. format_function
如果需要对请求block的返回结果进行二次处理,则需要在此填写函数名,模板如下:
"format_function":"[{\"from\":\"start_time\",\"function\":\"format_date\",\"to\":\"start_time\"}]"
说明:
- format_functoin参数值为json字符串(字符串解析后为数组,需要用方括号括起来)- from 来源字段
- function 执行的函数名
- to 输出字段
 
function 当前实现的有:
format_month 输出 2022-06
format_date  输出 2022-06-23
format_hour  输出 12:00
format_week  输出 26    //第几周
1.3.5. condition
condition是一个key-value的一维对象,里边的key是根据接口要求设置的,具体详见block接口文档。
1.3.5.1. 时间类型的参数
目前,统计计算接口中已经支持时间属性有4个,分别是 "start"、"end"、"id"、"created";他们均支持写php的date函数来定义接口传参所需的时间,比如:
start:"date('Y-m-d 07:00:00',time())", // start为每天 07:00:00
end:"date('Y-m-d 08:00:00',time())", // end为每天 08:00:00
where_and:"[[\"created\",\"=\",\"date('Y-m-d H:i:s', strtotime(date('Y-m', time()) . '-01 00:00:00'))\"]]", // created为每个月1号
具体写法可参考 php 取时间
1.3.5.2. 常用php时间段
| 时间段 | start | end | 
|---|---|---|
| 当日 | date('Y-m-d 00:00:01', time()) | date('Y-m-d 00:00:00', strtotime('+1 day', time())) | 
| 昨日 | date('Y-m-d 00:00:01', strtotime('-1 day', time())) | date('Y-m-d 00:00:00', time()) | 
| - | - | - | 
| 当月 | date('Y-m-01 00:00:01', time()) | date('Y-m-01 00:00:00', strtotime("+1 month",time())) | 
| 上月 | date('Y-m-01 00:00:01', strtotime("-1 month",time())) | date('Y-m-01 00:00:00', time()) | 
| - | - | - | 
| 当年 | date('Y-01-01 00:00:01', time()) | date('Y-12-31 23:59:59', time()) | 
| 去年 | date('Y-01-01 00:00:01', strtotime('-1 year', time())) | date('Y-12-31 23:59:59', strtotime('-1 year', time())) | 
start ≤ end_time  ≤  end ; end_time为 apim get_statistics_list接口返回值
1.3.6. field
field参数是需要解析的api接口返回的字段,如果是一个字段,则直接输入对应字段名称即可,比如:
field:"data"
如果多列|行单元格的时候,可以以英文逗号分隔字段设置,比如:
field:"id,created,data"
但有时统计计算返回的data属性(或者任意一个名字都可以)并不是一个字符串,而是一个数组,而我们想取数组下某一个元素时,此时可如下设置:
// data的值 ["360.00","198.99"]
// data|0 则取data的第一个元素=》"360.00" ,data|1 则取data的第二个元素=》"198.99",以此类推
field:"id,created,data|0
1.3.7. block
block参数代表需要被访问的数据源的block标识,具体参考mixiot的block_id的枚举。
1.4. tableman报表脚本示例
对于插入tableman的数据,需要首先在tableman系统中创建表格,然后脚本才能正常执行。
tableman的脚本跟excel脚本有部分差异:
{
    "report_table1":[
        {
            "block_id":"apim",
            "condition":{
                "items":5,
                "action":"get_statistics_list",
                "object_id":"OBJ1684490200006"
            },
            "field":"data,start_time,end_time",
            "table_field":"data1,data2,data3",
            "format_function":""
        }
    ],
    "report_table2":[
        {
            "block_id":"apim",
            "condition":{
                "items":5,
                "action":"get_statistics_list",
                "object_id":"OBJ1684490200006"
            },
            "field":"data,start_time,end_time",
            "table_field":"value1,value2,value3",
            "format_function":""
        }
    ]
}
tableman每个工作簿中,每个对象的主要属性如下:
| 属性 | 说明 | 
|---|---|
| block_id | 需要获取数据源的block | 
| condition | 请求 api 需要传递的参数集合 | 
| field | 需要从 api 返回结果解析到单元格的字段 | 
| table_field | 预期要插入到对应表的什么字段,和field中的字段一一对应 | 
| format_function | 格式化函数,在自定义接口时使用,不用则可置空 | 
对于field和table_field的对应关系,这里详细说明一下:
上面的脚本表示:
接口获取的数据包含data,start_time,end_time字段,
希望将data放到report_table1表的data1,
start_time放到report_table1表的data2,
end_time放到report_table1表的data3。
report_table2的情况相同。