# 一、监控导出excel导出埋点开口子

## 1.钩子功能概述

流程监控导出excel，客户有二开定制列也需要实现导出功能；

导出功能埋点开口子，便于二开人员灵活的切入进行开发实现添加自定义列导出，增加或删除的导出列以及列数据。

**最低支持基线版本251101**

## 2.逻辑调用说明

标准的流程监控列表数据导出逻辑获取到需要导出的数据后，会扫描执行此钩子中注册的自定义逻辑，将导出的数据传递给二开钩子，
二开逻辑中对数据进行修饰处理后返回。



钩子标识参数：
code = "WORKFLOW_LIST_EXPORT_001"

**口子参数参考示例中的注释**



## 3.二开注册钩子示例
~~~java
package com.weaver.seconddev.workflow.export;


import cn.hutool.core.date.DateUtil;
import com.weaver.common.component.table.column.WeaTableColumn;
import com.weaver.loom.context.annotation.WeaHookReg;
import com.weaver.loom.context.domain.AppInfo;
import com.weaver.loom.context.domain.WeaHookRequest;
import com.weaver.loom.context.domain.WeaHookResponse;
import com.weaver.loom.context.register.RegHookEvent;
import com.weaver.workflow.common.entity.list.component.WeaTableColumnEntity;
import com.weaver.workflow.common.entity.list.component.WeaTableEntity;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@WeaHookReg(code = "WORKFLOW_LIST_EXPORT_001", order = 0)
public class MonitorDataExportWeaHookRegDemo extends RegHookEvent {
    @Override
    public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
        //入参，修改入参并不会影响到埋点的原始数据
        Map<String, Object> params = request.getParams();
        int wflExportListTypeCode =  (int)params.get("wflExportListTypeCode");//导出数据列表类型 流程监控：2001
        WeaTableEntity weaTableEntity = (WeaTableEntity)params.get("weaTableEntity");//标准修饰处理前的导出数据，包含列定义信息和导出数据
        Long userId = (Long)params.get("userId");
        String tenantKey = (String)params.get("tenantKey");


        //前面同一埋点多个二开，前面链路节点二开代码执行的结果
        Object result = response.getResult();
        if (result != null) {
            //todo 处理params 与 传进来的前面链路的 result
            //如 未读取response 中的result数据 直接将新的数据写入response 会覆盖前面链路的返回值

            response.setResult(result);
        } else {
            //todo 将结果写入response
            //如果没有实际的返回数据可以不设置result，不要自己插入不支持序列化的类型，不然会报错
            response.setResult(result);
        }
        //以上链路节点二开代码执行的结果处理逻辑由二开人员自行判断处理；


        //以下代码片段为加一个自定义列的封装传参示例：
        //注意：response.setResult();只能传null(不返回二开数据)，或者从params中取到的WeaTableEntity参数修饰后的结果，示例如下：
        if(wflExportListTypeCode==2001){//流程监控
            List<WeaTableColumn> columnsDemo =  weaTableEntity.getColumns();//列信息

            WeaTableColumnEntity newCusColEntity = new WeaTableColumnEntity();//新增列
            newCusColEntity.setDataIndex("newCusCol");//列的标识
            newCusColEntity.setHide(false);//固定值
            newCusColEntity.setListHide(false);//固定值
            newCusColEntity.setListOrder(100);//自定义排序
            newCusColEntity.setTitle("自定义列");//列名称
            columnsDemo.add(newCusColEntity);

            ArrayList<HashMap> displayData = (ArrayList<HashMap>)weaTableEntity.getDisplayData();//导出的数据
            for(HashMap row:displayData){
                row.put("newCusCol",row.get("requestid"));//此处示例将导出每一行数据的requestid取出作为新的列数据，row中包含数据的一些基础字段数据，比如创建人、requestid等 具体可以参考监控列表data
            }
        }


        //注意此处返回修饰后的weaTableEntity数据，标准才会获取并执行导出
        response.setResult(weaTableEntity);



        return response;//返回结果
    }

    @Override
    public void rollBack(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
        //todo
        //自定义二开代码异常回滚逻辑
        log.info("执行事件回滚机制 => {}, {}", DateUtil.now(), appInfo.getAppName());
    }
}

~~~

# 二、RPC接口

## 2.1、监控启用停用

### 支持版本 
- 最低支持版本：10.0.2508.01

### 接口说明
rpc路径
com.weaver.workflow.list.api.rest.right.WflRequestMonitorRest

rpc方法：
controlMonitorDataState

 
参数：

| 参数名称 | 参数类型 |参数说明 |
| ---- | ---- |----|
| permissionIds | List\<Long>|  监控设置id，monitorid|
| dataState | int | 修改状态，0启用，1禁用  如果传0就是启用第一个入参对应的监控设置，如果是0就是禁用 |

返回数据

boolean 类型，true 表示成功，false 表示失败





流程监控设置表：wfc_monitor_set  

流程字段名称：data_state  0是启用，1是禁用

权限表对应字段名称：delete_type   0是正常状态 3是禁用状态
