# 流程存文档-二开口子

> 负责人： 陈红亮

# 一、后端口子（含RPC/controller/openApi）



## 1.1、根据流程requestId生成流程详情PDF、Html附件

> 根据流程requestId生成对应流程详情的PDF、Html附件，支持指定节点、指定显示布局或打印模板id来生成

### 1.1.1 、请求信息

*   请求方式：RPC
*   请求group：workflow
*   请求地址：com.weaver.workflow.core.api.rest.todoc.WfcTodocRest#wfToDocFile

### 1.1.2 、入参说明

> **入参对象**：

com.weaver.workflow.common.dto.todoc.WfToDocFileParamDto

> **入参说明：**

| 参数名称               | 参数描述                           | 必选     | 类型                | 说明                                                         |
| ---------------------- | :--------------------------------- | -------- | ------------------- | ------------------------------------------------------------ |
| requestId              | 流程id                             | 是       | Long                | 流程id                                                       |
| nodeId                 | 节点id                             | 否       | Long                | 会判断是否传了nodeid ，没有传就取当前节点 【优先级第二】     |
| layoutType             | 模板类型                           | 否       | int                 | 模板类型 0：表单模板  1：打印模板                            |
| layoutId               | 表单/打印布局id                    | 否       | Long                | 会判断是否传了layoutId 传了就取【优先级最大】                |
| refDocId               | 附件关联文档id                     | 否       | Long                | 附件是否关联docId                                            |
| folderId               | 附件目录id                         | 否       | Long                | 附件目录id                                                   |
| keepSign               | 是否保留签字意见                   | 否       | boolean             | 默认值为false                                                |
| hideSysArea            | 隐藏顶部系统字段区域               | 否       | boolean             | 默认值为false，不传参或传false时取【应用设置】-【表单顶部系统字段区域设置】，根据layoutType判断是取【PC端显示顶部系统字段区域】或【网页版打印显示顶部系统字段区域】 |
| hideRelateMatterArea   | 隐藏事项关联区域                   | 否       | boolean             | 默认值为false，不传参或传false时取【工作流】-【基础设置】-【关联事项设置】， 根据layoutType判断是取【允许详情页关联事项】或【网页版打印显示关联事项】 |
| onlineHtml             | 是否生成在线html                   | 按需选择 | boolean             | 默认值为false                                                |
| offlineHtml            | 是否生成离线html（zip格式）        | 按需选择 | boolean             | 默认值为false                                                |
| pdf                    | 是否生成pdf                        | 按需选择 | boolean             | 默认值为false                                                |
| pdfFileName            | 指定生成的pdf文件名                | 否       | String              | 默认值为使用流程标题                                         |
| isStartThread          | 是否开启线程执行                   | 否       | boolean             | 默认值为false                                                |
| convertToPdfType       | 生成pdf插件方式                    | 否       | int                 | 0：wk插件，1：无头浏览器，默认wk插件                         |
| isUseArchiveNodeLayout | 是否使用归档节点的模板布局生成附件 | 否       | boolean             | false:不使用，true:使用 默认为false                          |
| displayWatermark       | 是否显示流程水印                | 否       | boolean             | false:否，true:是 默认为false                          |
| otherParam             | 其他参数                           | 否       | Map\<String,Object> | 其他拓展参数                                                 |

> otherParam值说明

otherParam可以不传，部分场景意见评论列表需要额外控制不鉴权和不走意见范围控制的在otherParam中传参控制

| 参数名称           | 参数描述           | 必选 | 类型 | 说明                                                        |
| ------------------ | :----------------- | ---- | ---- | ----------------------------------------------------------- |
| noAuth             | 评论读取是否鉴权   | 否   | int  | 默认需要鉴权，传1：不需要鉴权，会取创建人身份来获取意见数据 |
| noSignRangeControl | 不需要意见范围控制 | 否   | int  | 默认需要意见范围控制，传1:不加意见范围控制                  |

### 1.1.3、调用示例

```java
public class Test {

    @RpcReference(group = "workflow")
    WfcTodocRest wfcTodocRest;

    public void test() {
    	WfToDocFileParamDto paramDto = new WfToDocFileParamDto();
        paramDto.setRequestId(流程requestId);
        paramDto.setPdf(true);
        //rpc调用
	WfToDocFileResultDto wfToDocFileResultDto = wfcTodocRest.wfToDocFile(WfToDocFileParamDto paramDto, long userId);
    }
}
```

### 1.1.4 、返回值说明

> **返回对象**：

com.weaver.workflow.common.dto.todoc.WfToDocFileResultDto

> **出参说明：**

| 参数名称          | 参数描述       | 类型 | 说明           |
| ----------------- | :------------- | ---- | -------------- |
| pdfFileId         | pdf附件id      | Long | pdf附件id      |
| onlineHtmlFileId  | 在线html附件id | Long | 在线html附件id |
| offlineHtmlFileId | 离线html附件id | Long | 离线html附件id |
| requestid         | 流程id         | Long | 流程id         |

## 1.2、根据流程requestId生成文档

> 根据流程requestId生成文档，文档包含流程详情PDF、Html附件，接口效果与标准批量存文档功能一致

### 1.2.1 、请求信息

*   请求方式：RPC
*   请求group：workflow
*   请求地址：com.weaver.workflow.core.api.rest.todoc.WfcTodocRest#workflowTodocByManual

### 1.2.2 、入参说明

> **入参说明：**

| 参数名称  | 参数描述     | 必选 | 类型 | 说明         |
| --------- | :----------- | ---- | ---- | ------------ |
| requestId | 工作流请求id | 是   | long | 工作流请求id |
| folderId  | 附件目录id   | 否   | Long | 附件目录id   |

### 1.2.3、调用示例

```java
public class Test {

    @RpcReference(group = "workflow")
    WfcTodocRest wfcTodocRest;

    public void test() {
        //rpc调用
	Map<String, Object> resultMap = wfcTodocRest.workflowTodocByManual(requestId, folderId, user);
    }
}
```

### 1.2.4 、返回值说明

> **出参对象**：

Map<String, Object>

> **出参对象属性：**

| key       | value     | 说明       |
| --------- | :-------- | ---------- |
| docIdList | docIdList | 文档id集合 |

## 1.3、获取模板布局id

> 根据流程requestId、workflowId获取模板布局id

### 1.3.1 、请求信息

*   请求方式：RPC
*   请求group：workflow
*   请求地址：com.weaver.workflow.core.api.rest.todoc.WfcTodocRest#getMultiLayoutId

### 1.3.2 、入参说明

> **入参对象**：

com.weaver.workflow.common.dto.todoc.WfcMultiLayoutIdParamDto

> **WfcMultiLayoutIdParamDto对象属性：**

| 参数名称   | 参数描述     | 必选 | 类型 | 说明                                                     |
| ---------- | :----------- | ---- | ---- | -------------------------------------------------------- |
| workflowId | 工作流id     | 是   | long | 工作流id                                                 |
| requestId  | 工作流请求id | 是   | long | 工作流请求id                                             |
| nodeId     | 节点id       | 否   | Long | 会判断是否传了nodeId ，没有传就取当前节点 【优先级第二】 |

### 1.3.3、调用示例

```java
public class Test {

    @RpcReference(group = "workflow")
    WfcTodocRest wfcTodocRest;

    public void test() {
    	WfcMultiLayoutIdParamDto paramDto = new WfcMultiLayoutIdParamDto();
        paramDto.setWorkflowId(workflowId);
        paramDto.setRequestId(requestId);
        //rpc调用
	Long resultId = wfcTodocRest.getMultiLayoutId(paramDto, user);
    }
}
```

### 1.3.4 、返回值说明

> **出参说明：**

返回模板布局id

## 1.4、文档关联到表单字段中显示

### 1.4.1 、请求信息

*   请求方式：RPC
*   请求group：workflow
*   请求地址：com.weaver.workflow.core.api.rest.todoc.WfcTodocRest#saveDocToForm

### 1.4.2 、入参说明

> **入参说明**：

| 参数名称             | 参数描述                    | 必选 | 类型                                                      | 说明                        |
| -------------------- | :-------------------------- | ---- | --------------------------------------------------------- | --------------------------- |
| WfToDocFileResultDto | 流程存PDF .HTML附件结果对象 | 是   | com.weaver.workflow.common.dto.todoc.WfToDocFileResultDto | 流程存PDF .HTML附件结果对象 |
| docId                | 文档id                      | 是   | Long                                                      | 文档id                      |
| workflowId           | 工作流id                    | 是   | long                                                      | 工作流id                    |
| requestId            | 工作流请求id                | 是   | long                                                      | 工作流请求id                |

> **WfToDocFileResultDto对象属性：**

| 参数名称          | 参数描述       | 必选 | 类型 | 说明           |
| ----------------- | :------------- | ---- | ---- | -------------- |
| onlineHtmlFileId  | 在线html附件id | 否   | long | 在线html附件id |
| offlineHtmlFileId | 离线html附件id | 否   | long | 离线html附件id |
| pdfFileId         | pdf附件id      | 否   | long | pdf附件id      |

### 1.4.3、调用示例

```java
public class Test {

    @RpcReference(group = "workflow")
    WfcTodocRest wfcTodocRest;

    public void test() {
    	WfToDocFileResultDto paramDto = new WfToDocFileResultDto();
        paramDto.setOnlineHtmlFileId(onlineHtmlFileId);
        paramDto.setOfflineHtmlFileId(offlineHtmlFileId);
        paramDto.setPdfFileId(pdfFileId);
        //rpc调用
	Boolean result = wfcTodocRest.saveDocToForm(paramDto, docId, workflowId, requestId, user);
    }
}
```

### 1.4.4 、返回值说明

> **出参说明：**

保存成功true，失败false

## 1.5、获取流程存为文档后端设置的目录id

### 1.5.1 、请求信息

*   请求方式：RPC
*   请求group：workflow
*   请求地址：com.weaver.workflow.core.api.rest.todoc.WfcTodocRest#getFolderId

### 1.5.2 、入参说明

> **入参说明**：

| 参数名称             | 参数描述                    | 必选 | 类型                                                      | 说明                        |
| -------------------- | :-------------------------- | ---- | --------------------------------------------------------- | --------------------------- |
| workflowId           | 工作流id                    | 是   | long                                                      | 工作流id                    |
| requestId            | 工作流请求id                | 是   | long                                                      | 工作流请求id                |

### 1.5.3、调用示例

```java
public class Test {

    @RpcReference(group = "workflow")
    WfcTodocRest wfcTodocRest;

    public void test() {
        //rpc调用
	Long resultId = wfcTodocRest.getFolderId(workflowId, requestId, user);
    }
}
```

### 1.5.4 、返回值说明

> **出参说明：**

返回目录id



## 1.6、获取流程存为文档后端配置

### 1.6.1 、请求信息

*   请求方式：RPC
*   请求group：workflow
*   请求地址：com.weaver.workflow.pathdef.api.rest.todoc.WfpWorkflowTodocRest#queryWftodocConfig

### 1.6.2 、入参说明

> **入参说明**：

| 参数名称             | 参数描述                    | 必选 | 类型                                                      | 说明                        |
| -------------------- | :-------------------------- | ---- | --------------------------------------------------------- | --------------------------- |
| workflowId           | 工作流id                   | 是   | long                                                     | 工作流id                    |
| nodeid               | 节点id                    | 否   | long                                                      | 给默认值-1即可                |
| WeaUser              | 用户对象                   | 是   | WeaUser                                                  | 当前用户对象                |

### 1.6.3、调用示例

```java
public class Test {

    @RpcReference(group = "workflow")
    WfpWorkflowTodocRest wfpWorkflowTodocRest;

    public void test() {
        //rpc调用
				WeaUser weaUser = new WeaUser();
        weaUser.setUserId(employeeId);
        weaUser.setTenantKey(tenantKey);
        // 查询流程存文档参数
        WfpWorkflowToDocEntity workflowToDocEntity = wfpWorkflowTodocRest.queryWftodocConfig(Long.parseLong(workflowId), -1, weaUser);
    }
}
```

### 1.6.4 、返回值说明

> **出参对象**：

WfpWorkflowToDocEntity

> **出参对象属性：**

| key       | value     | 说明       |
| --------- | :-------- | ---------- |
| docSource | 0/1   |  转换附件的来源，0：显示布局 1：打印布局|
| layoutId | long类型   |  选择布局指定的布局ID|
| offlineHtml | 0/1   |  离线表单html,0：未勾选，1：勾选|
| onlineHtml | 0/1   |  在线表单html,0：未勾选，1：勾选|
| pdf | 0/1   |  pdf,0：未勾选，1：勾选|
| displayInForm | 0/1   |  文档关联到表单字段中显示，0：未启用，1：启用|
| displayWatermark | 0/1   |  文档显示流程水印，0：未启用，1：启用|


## 1.6、在线/离线表单html二开复写追加js/css

最低版本：2603基线

~~~java
package com.weaver.seconddev.workflow.hooks;

import com.alibaba.fastjson.JSON;
import com.weaver.loom.api.annotation.RegHook;
import com.weaver.loom.context.register.AbstractRegHookEvent;
import com.weaver.workflow.common.entity.org.WeaUser;
import com.weaver.workflow.common.entity.pathdef.path.wftodoc.WfpWorkflowToDocEntity;
import com.weaver.workflow.common.util.DataTransUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 流程存为文档，在线表单html、离线表单html中增加自定义js、css代码
 */
@Slf4j
@Component
@RegHook(module = "workflow", event = "wfcToDocCusJsCss", order = 1)
public class WfcToDocAddCustomJsCodeHook extends AbstractRegHookEvent {

    @Override
    public Object handle(Object[] args) throws Exception {
        log.error("WfcToDocAddCustomJsCodeHook start");
        if(Objects.nonNull(args) && args.length >2){
            Map<String,Object> baseParam = (Map<String, Object>) args[0]; //基础参数
            WfpWorkflowToDocEntity wfpWorkflowToDocEntity = (WfpWorkflowToDocEntity) args[1]; //流程存为文档配置信息
            WeaUser user = (WeaUser) args[2]; //user对象

            long requestId = DataTransUtil.getLongValue(baseParam.get("requestId"));
            long workflowId = DataTransUtil.getLongValue(baseParam.get("workflowId"));
            long nodeId = DataTransUtil.getLongValue(baseParam.get("nodeId")); //节点ID
            long multiLayoutId = DataTransUtil.getLongValue(baseParam.get("multiLayoutId")); //布局ID
            long dataId = DataTransUtil.getLongValue(baseParam.get("dataId")); //数据ID
            boolean isOnline = "true".equals(DataTransUtil.null2String(baseParam.get("isOnline"))); //true为在线表单html，false为离线表单html

            log.error("baseParam:{}", JSON.toJSONString(baseParam));
            log.error("wfpWorkflowToDocEntity:{}", JSON.toJSONString(wfpWorkflowToDocEntity));

            Map<String,Object> result = new HashMap<>();
            StringBuffer jsStr = new StringBuffer();  //注意：无需<script></script>包裹
            jsStr.append("console.log(\"自定义js1\")").append("\n");
            jsStr.append("console.log(\"自定义js2\")").append("\n");

            StringBuffer cssStr = new StringBuffer(); //注意：无需<style></style>包裹
            cssStr.append(".customcss1{").append("\n");
            cssStr.append("   display:none;").append("\n");
            cssStr.append("   margin:0 0;").append("\n");
            cssStr.append("}").append("\n");

            cssStr.append(".customcss2{").append("\n");
            cssStr.append("   display:none;").append("\n");
            cssStr.append("}").append("\n");

            result.put("js",jsStr.toString());
            result.put("css",cssStr.toString());
            log.error("WfcToDocAddCustomJsCodeHook tenantkey:{},result:{}",user.getTenantKey(),result);
            log.error("WfcToDocAddCustomJsCodeHook end");
            return result;
        }
        return null;
    }
}
~~~



# 二、前端口子

## 2.1、组件props复写

> 组件名称

>props说明

>复写示例

# 三、常用表说明/Sql

> 二开不要直接写sql，优先通过接口调用，没有接口的评估开放；此处仅列举常用表、sql做了解

存文档基础配置表
select * from wfp_todoc_config 

存文档文档属性配置表
select * from wfp_todoc_docprop 

存文档执行记录表
select * from wfc_todoc_exec_result 


# 四、二开场景案例