# 拟签意见二开文档

> 负责人：陈红亮（后端）、董孙建（前端）

# 一、前端相关sdk

## 1.1、获取所有拟签控件opinionId
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> 获取当前页面上已加载的所有拟签控件opinionId，未产生数据的获取不到；

```javascript
const wffpSdk = weappWorkflow.getFlowPageSDK();
const opinionIds =  wffpSdk.getDraftOpinionIds();
```

## 1.2、获取一人一条数据集合
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> 可根据1.1获取到的控件 opinionId，根据opinionId 获取该控件所有一人一条数据
>
> isGetOriginData 默认为true 获取数据入库数据，false获取当前渲染数据

```javascript
/**
*
* 根据opinionId 获取一人一条控件数据
* @param {string} opinionId
* @param {boolean} [isGetOriginData=true] 默认获取 实际入库数据 而非当前render 数据
* @memberof Sdk_base
*/
const wffpSdk = weappWorkflow.getFlowPageSDK();
const opinionList = wffpSdk.getDraftOpinionListById(opinionId)
```

![](/api/file/preview?fileId=952421045466120199\&type=imgs)

## 1.3、指定意见落款
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> setDraftOpinionRecord 传入控件唯一标识，需落款数据唯一标识，完成对指定的一人一条意见落款

```javascript
/**
 * @param {string} opinionId 控件唯一标识
 * @param {string} contentId 落款数据唯一标识
*/
const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.setDraftOpinionRecord(opinionId,contentId);
	
```

## 1.4、修改拟签控件读写属性
<font color="#FF0000">最低版本支持：weapp-workflow-1.48</font>

> JS-SDK接口将控件置为可编辑，从而支持传阅身份打开，可将指定拟签控件置为可编辑状态。

> *wffpSdk.changeDraftOpinionAttr(attr\:number, field?\:string)*

| 参数    | 说明                  | 类型     | 是否必填 | 默认    |
| :---- | :------------------ | :----- | :--- | :---- |
| attr  | 1:只读 2：编辑           | number | 是    |       |
| field | 单个控件生效，未传默认所有拟签控件生效 | string | 否    | 'all' |

注意：

*   结束会签后，同组织维度的无法通过JS-SDK将只读控件设置为可编辑；
*   节点字段权限或设计器上设置拟签意见控件为只读或不显示时，无法通过该JS-SDK设置为可编辑；

```javascript
/**
* @param {attr} attr 1 只读 2 编辑
* @param {string} [field] 选填 不传 默认对所有拟签控件生效;  指定控件权限控制>默认al
*/

const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.changeDraftOpinionAttr(attr,field);
```

## 1.5、过滤修改一人一条数据
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> api 1.2 获取控件数据集合，结合api1.5 传入新的集合实现拟签一人一条过滤、排序展示

**注意**： 可以修改意见数组中的内容，达到修改一人一条意见的目的，但是不可修改数据结构，避免报错！

```javascript
/**
* 拟签意见一人一条 sdk 支持过滤展示意见
*
* @param {string} opinionId 控件唯一标识
* @param {string[]} newOpinionList 需要展示的意见集合
* @memberof Sdk_base
*/
const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.filterDraftOpinionList(opinionId,newOpinionList);
```

## 1.6、刷新控件意见列表
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> 根据opinionId刷新一人一条或多人一条控件的意见列表

```javascript
/**
* 根据opinionId 刷新拟签
* @param opinionId 
* @param needReq 是否走接口刷新 默认false
*/
const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.refreshDraftOpinion(opinionId,false);
```

## 1.7、获取所有拟签控件基础数据
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> 区别于api1.1 可获取所有控件id和对应控件名称 name、field

```javascript
const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.getDraftOpinionInfo()
```
## 1.8、设置拟签意见输入框提示语
<font color="#FF0000">最低版本支持：weapp-workflow-1.57</font>

> 可根据1.7获取到控件field，根据field设置输入框提示语

```javascript
const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.setDraftOpinionPlaceholder(field,'请输入')
 ```
## 1.9、新增拟签意见设置默认意见
<font color="#FF0000">最低版本支持：weapp-workflow-1.61</font>

> 可根据1.7获取到控件field，根据field设置默认意见

```javascript
const wffpSdk = weappWorkflow.getFlowPageSDK();
wffpSdk.setDraftOpinionDefaultSign(field,'同意')
```

    
# 二、前端API说明

> 该api为整个控件维度，通过ecode 复制控件相关props 来快速无侵入二开
>
> pc端：DraftOpinionView       移动端：MDraftOpinionView

### 参数说明如下：

| **参数**                       | **说明**      | **类型**                                                                         | **是否必填** | **默认值** |
| :--------------------------- | :---------- | :----------------------------------------------------------------------------- | :------- | :------ |
| customRenderDraftOpinionBtns | 自定义添加顶部操作按钮 | （{opinionId\:string,opinionType\:string,isReadOnly\:boolean}）=>React.ReactNode | 否        |         |
| separator                    | 落款人员分割符     | string                                                                         | 否        | ，（中文逗号） |
| displayInForm                | 意见框是否在表单    | boolean                                                                        | 否        | false   |
|isAppendRecord  |修改他人意见是否默认落款(weapp-workflow-1.61) |boolean | 否|true|




# 三、二开场景-输入框在表单

## 1、背景

### 1.1、总体方案

*   拟签意见支持props控制不以弹框形式编辑意见框，再借助表单上的插槽组件开发输入框。
*   标准指定位置预留插槽组件，可以快捷的进行复写，其中插槽组件已提供一些如 保存意见方法、拦截点击事件方法等必要方法来方便二开人员开发，下面会说明。

## 2、组件复写

### 2.1、复写插槽组件
<font color="#FF0000">最低版本支持：weapp-workflow-1.50</font>

> 插槽组件源码：

```javascript
import React from 'react';
import { observer} from 'mobx-react';
import { middleware} from "@weapp/utils";
import {app} from "../../../../../constants/warekey";
import {OpinionDialogType} from './type';

interface  btnEventParam {
    menuKey : 'fill' | 'endCountersign' | 'copyClear' | 'generateRecord'  //添加意见 结束会签 抄清 代录
}

type HookType = 'afterSave' // 保存后钩子事件
type InterceptType = 'beforeTriggerBtnEvent' // 按钮点击事件拦截


interface SlotProps {
	contentId:string, //新增意见为-1  一人一条中 为当前意见唯一标识 contentId
    currentRemark:string, //当前操作的意见内容
    currentUpdateData?:any, //当前修改数据信息
    changeRemark:(str:string) => void, //修改意见方法
    saveRemark:() =>void, //添加或修改意见共用方法 
    draftConfig:any, //拟签相关配置信息 如字体字号、是否开启纯文本编辑,
    slotPlace:'inOnePersonOpinion' | 'underTitle', //插槽位置  一人一条意见中 | 拟签标题下
    signInputConfig:OpinionDialogType, // 操作类型及弹框显隐  二开可直接利用 受控自身二开内容
    setSignInputConfig:(config:OpinionDialogType) => void, //设置当前操作类型 以及 显隐
    triggerBtnEvent:(data:btnEventParam) => void, //顶部 填写意见、抄清、代录触发事件
    registerDraftHookEvent:(types: HookType | Array<HookType>, fn: Function) => void, //注册拟签钩子事件，可注册保存修改后钩子事件
    registerDraftInterceptEvent:(types: InterceptType | Array<InterceptType>, fn: Function) => void, //注册拟签拦截事件  beforeTriggerBtnEvent:点击按钮拦截事件
}


@middleware(app,'DraftOpinionSlot')
@observer
class Slot extends React.Component<SlotProps>{
    render() {
        return (
            <>
                {this.props.children}
            </>
        )
    }
}

export default Slot;



```

#### 2.1.1、 输入框开发相关问题

*   **如何实现自定义输入框在表单上？**

    1.  通过2.3 示例复写拟签组件，改为非弹框模式。
    2.  二开自定义替换插槽组件为意见框组件。

*   **如何点击填写编辑意见、控制自定义的意见框显示，修改新增意见后隐藏？**

    1.  可借助signInputConfig = {visible\:false,type:'add'} 标准填写、修改意见会修改改属性，填写完成后会自动将visible = false。signInputConfig用于修改signInputConfig 。
    2.  也可以利用钩子事件registerDraftHookEvent自行控制自定义输入框。

*   **自定义输入框输入的意见如何修改入库？**

    1.  用changeRemark传入意见内容。
    2.  直接调用saveRemark()直接保存， 保存修改共用，具体是保存还是修改内部会自动判断。

*   **修改拟签一人一条如何隐藏原意见，修改完成后显示最新意见？**

    1.  一人一条意见 意见存在特定className： weapp-workflow-draftopinion-oneperson-\${contentId}，点击编辑按钮时，props将接受到最新的编辑信息currentUpdateData。根据currentUpdateData隐藏指定class下面的意见。
    2.  注册钩子意见registerDraftHookEvent，修改完成，在钩子事件内部控制再显示即可。

*   **如何提交流程时自动提交拟签输入框中的意见？**

    1.  获取当前流程sdk 实列，注册提交提交拦截事件。
    2.  流程提交拦截事件内部，触发拟签保存，拟签保存完成后，可在拟签afterSave钩子事件中再走流程保存。

*   **意见框相关配置哪里读取？**

    1.  draftConfig中将会拿到意见框相关配置，如字体、字号、是否使用纯文本意见输入框等配置。
    2.  其中从 字体值 draftConfig.defautFont 与实际font-family映射关系 参考如下：

        ```javascript
            getFontFamily = (id: string) => {
                let fontFamily: string = 'Microsoft YaHei';
                let fontName: string = "微软雅黑";
                if (id === '70') { //幼圆
                    fontFamily = 'YouYuan';
                    fontName = '幼圆';
                } else if (id === '80') { //隶书
                    fontFamily = 'LiSu';
                    fontName = '隶书';
                } else if (id === '90') { //楷体
                    fontFamily = 'KaiTi';
                    fontName = '楷体';
                } else if (id === '10') { //仿宋
                    fontName = '仿宋';
                    fontFamily = 'FangSong';
                } else if (id === '11') { //新宋体
                    fontName = '新宋体';
                    fontFamily = 'NSimSun';
                } else if (id === '12') { //微软雅黑
                    fontName = '微软雅黑';
                    fontFamily = 'Microsoft YaHei';
                } else if (id === '13') { //华文中宋
                    fontName = '华文中宋';
                    fontFamily = 'STZhongsong';
                } else if (id === '14') { //华文隶书
                    fontName = '华文隶书';
                    fontFamily = 'STLiti';
                } else if (id === '15') { //华文琥珀
                    fontName = '华文琥珀';
                    fontFamily = 'STHupo';
                } else if (id === '160') { //华文楷体
                    fontName = '华文楷体';
                    fontFamily = 'STKaiti';
                } else if (id === '170') { //华文仿宋
                    fontName = '华文仿宋';
                    fontFamily = 'STFangsong';
                } else if (id === '180') { //方正姚体
                    fontName = '方正姚体';
                    fontFamily = 'FZYaoti';
                } else if (id === '190') { //方正舒体
                    fontFamily = 'FZShuTi';
                } else if (id === '200') { //华文彩云
                    fontName = '华文彩云';
                    fontFamily = 'STCaiyun';
                } else if (id === '210') { //华文行楷
                    fontName = '华文行楷';
                    fontFamily = 'STXingkai';
                } else if (id === '220') { //黑体
                    fontName = '黑体';
                    fontFamily = 'SimHei';
                } else if (id === '230') { //宋体
                    fontName = '宋体';
                    fontFamily = 'SimSun';
                }
                return {
                    fontFamily: fontFamily,
                    fontName: fontName
                };
            }
        ```

#### 2.1.2、 注意事项

*   拟签目前存在俩处插槽，分别为一人一条意见中以及 顶部 拟签标题下 通过slotPlace区分，若使用注册事件，避免多次注册。

*   注意编辑时 纯文本、富文本之间转换问题：
    1.  先用富文本输入意见、后将设置改成纯文本框，此时需要自动用富文本框编辑。
    2.  先用纯文本框产生意见、后将设置改成富文本框，此时可读取设置用富文本框编辑 \
        (是否为纯文本框编辑：draftConfig.openTextarea)。

*   标准插槽组件是共用一个组件，可利用slotPlace、signInputConfig.type来做区分复写，实现新建编辑时候替换成不同组件。一面造成新建编辑替换成同一个组件。

### 2.2、输入框非弹框模式复写

> 支持 displayInForm = true 属性填写、编辑意见不走弹框模式

```javascript
regOvProps('weappWorkflow', 'DraftOpinionView', (props) => {
  props.displayInForm = true
  return props;
}, 0);

```

### 2.3、一人一条操作按钮复写

> 支持showQuickRecord 支持一键落款，customAppendBtns 支持自定义添加内容

```javascript
regOvProps('weappWorkflow', 'DraftOpinionOperateBtns', (props) => {
  props.showQuickRecord = true
  props.customAppendBtns = () => {
      return <Icon title = {'自定义Icon'}   name='Icon-daily-o' />
 }
  return props;
}, 0);
```

# 四、后端口子-支持修改他人意见
<font color="#FF0000">最低版本支持：weaver-workflow-core-service-1.61.0-hotfix33</font>


## 1、概述及说明

### 1.1、预留口子清单

- 标准默认，自己可以修改/删除自己当前节点的拟签意见；可通过后端复写接口，实现修改他人意见，修改意见权限由二开定义；修改非自己意见，标准产品在弹窗内默认支持，修改意见还能增加落款；
- 修改他人意见，结合增加落款，可实现一人一条意见，某一条意见展示多人落款效果；后端复写接口，控制落款排序/范围，实现自定义落款

### 1.2、注意事项

*   hotfix出包，weaver-workflow-core、weaver-workflow-pathdef、weaver-odoc、weapp-workflow几个服务需捆绑升级

## 2、后端预留口子

对于后端主要关注 onePersonOpinionRecordDTOList 数据结构中的 isDelete/isEdit 和 signers 属性。通过ecode二开复写一人一条意见接口返回结果，可以控制一人一条意见控件 编辑/删除 按钮的显隐

1.  onePersonOpinionRecordDTOList 一人一条意见数据展示结构
2.  isDelete/isEdit 控制一人一条意见 编辑/删除 按钮的显隐
3.  signers 落款人展示列表

![](/papi/file/preview?type=redirect\&imgFormat=image\&fileId=934630272837836801)

### 2.1、实现编辑他人意见

通过ecode二开，拦截拟签意见内容数据返回接口，修改意见对象对应属性，便可控制意见的 编辑/删除 权限。

当 onePersonOpinionRecordDTOList 中意见的 isEdit/isDelete 属性为 true，此条一人一条意见便拥有了 编辑/删除 权限。

### 2.2、一人一条落款多人，实现落款信息自定义

通过ecode二开，拦截拟签意见内容数据返回接口，修改落款人数组顺序，便可实现落款人信息自定义展示。

onePersonOpinionRecordDTOList 中意见的 signers 数组对象，存储所有落款人相关信息；前端落款人的展示与 signers 数组顺序保持一致，可以结合具体业务场景调整 signers 数组内容，从而实现落款信息自定义。

> 注意及说明

1.  当一人一条意见拥有 编辑/删除 权限后，还需结合前端控件的可编辑属性，才可实现编辑他人意见；
2.  onePersonOpinionRecordDTOList 中意见的 operator 对象为当前意见实际创建人，可以依据此判断编辑意见的是否是他人的意见；
3.  落款人信息目前仅展示100条；
4.  /getOpinionById、/getOpinionByRequestIdAndWidgetId、/list 二开拦截接口时需要同步拦截处理这三个接口中的数据，他们均会返回拟签意见控件信息；

    1.  /getOpinionById：编辑单个拟签意见控件后触发，更新拟签意见展示内容
    2.  /getOpinionByRequestIdAndWidgetId：刷新表单详情页面触发，获取所有拟签意见控件数据
    3.  /list：拟签意见高级搜索接口，获取搜索过后拟签意见展示内容

# 五、后端口子-支持删除落款

<font color="#FF0000">最低版本支持：weaver-workflow-core-service-1.64.0-hotfix31、weaver-workflow-core-service-1.65.0-hotfix12</font>


## 5.1、概述及说明
拟签控件，一人一条意见，支持多人联合落款，一键落款；对于用户误操作产生的联合落款，支持接口实现撤回落款。


## 5.2、注意事项

*   hotfix出包，weaver-workflow-core-service-engine jar


## 5.3、删除落款接口

**接口URL**：**POST** E10域名地址/api/workflow/core/draftopinion/deleteOpinionRecord

**Content-Type**：application/json

**接口入参字段：**

| **参数名**     | **必填** | **类型** | **说明**                   |
| :---------- | :----- | :----- | :----------------------- |
| currentUserId    | 否      | String | 当前用户ID              |
| identityType     | 否      | String | 当前用户身份类型    |
| identityId       | 否      | String | 当前用户身份ID      |
| opinionId        | 是      | String | 拟签ID              |
| contentId        | 是      | String | 拟签内容ID          |
| delOperatorIds   | 否      | String | 指定删除的落款人ID，空则默认删除当前用户落款          |
| deLOperateTypes  | 否      | String | 删除的拟签操作类型，空则默认add,edit,submit操作类型          |
| allowDelContent  | 否      | String | 是否允许删除拟签内容，空或非true则当删到最后一个落款人会阻止删除，为true则删最后一个落款人时会同时删掉拟签意见          |

**接口返回字段说明：**

| **参数名**      | **类型** | **说明**    |
| :----------- | :----- | :-------- |
| code         | Int | 返回码，0代表成功 |
| data         | Object | 返回信息      |
| data.status  | Boolean | 删除落款成功标记，true为删除成功      |
| data.msg     | String | 删除落款失败提示     |


**推送参数示例：**

```json
{
  "currentUserId":"",
  "identityType":"",
  "identityId":"",
  "opinionId":"950142303153864711",
  "contentId":"954213764663910401",
  "delOperatorIds":"",
  "deLOperateTypes":"",
  "allowDelContent":"false",
}
```

**接口返回报文示例：**

```json
{
    "code": 200,
    "msg": "执行成功",
    "status": true,
    "data": {
        "status": true
    },
    "fail": false
}

```

## 5.4、参数获取说明

**拟签ID（opinionId）、拟签内容ID（contentId）查找：**


![](/api/ecode/resource/view/${appRes}/1715824159-image.png)



# 六、后端口子-支持清空表单中所有拟签意见内容

<font color="#FF0000">版本：weaver-workflow-core-1.64.0-hotfix64</font>


## 6.1、概述及说明
清空表单中所有拟签意见内容，保留操作日志痕迹，清空后可以重新填写。

## 6.2、注意事项

*   hotfix出包，weaver-workflow-core-service-engine jar


## 6.3、清空表单中所有拟签意见内容接口

**接口URL**：**POST** E10域名地址/api/workflow/core/draftopinion/deleteAllOpinionContent

**Content-Type**：application/json

**接口入参字段：**

| **参数名**     | **必填** | **类型** | **说明**                   |
| :---------- | :----- | :----- | :----------------------- |
| currentUserId    | 否      | String | 当前用户ID              |
| identityType     | 否      | String | 当前用户身份类型    |
| identityId       | 否      | String | 当前用户身份ID      |
| requestId        | 是      | String | 请求ID              |
| nodeId           | 是      | String | 节点ID          |
| widgetIds   | 否      | String | 需删除拟签内容的拟签控件ID，多个用英文半角逗号分隔，当无allowDelAllWidget或allowDelAllWidget不为true时必填，与allowDelAllWidget二选一。          |
| allowDelAllWidget  | 否      | String | 是否允许删除所有拟签控件内容，true为允许，与widgetIds二选一。          |


**接口返回字段说明：**

| **参数名**      | **类型** | **说明**    |
| :----------- | :----- | :-------- |
| code         | Int | 返回码，0代表成功 |
| data         | Object | 返回信息      |
| data.status  | Boolean | 删除成功标记，true为删除成功      |
| data.msg     | String | 删除失败提示     |


**推送参数示例：**

- 根据控件ID删除

```json

{
  "currentUserId": "",
  "identityType": "",
  "identityId": "",
  "requestId": "1025085123269263368",
  "nodeId":"1024782392362860550",
  "widgetIds":"1024783534943027204,1024783534943027204"
}
```

- 根据requestId删除当前流程下所有拟签控件内容

```json

{
  "currentUserId": "",
  "identityType": "",
  "identityId": "",
  "requestId": "1025085123269263368",
  "nodeId":"1024782392362860550",
  "allowDelAllWidget":"true"
}
```

**接口返回报文示例：**


```json
{
    "code": 200,
    "msg": "执行成功",
    "status": true,
    "data": {
        "status": true
    },
    "fail": false
}

```

## 6.4、参数获取说明

**流程请求ID（requestId）、拟签控件ID（widgetId）查找：**

![](${appMdRes}/1722217087-image.png)


# 七、后端口子-支持结束拟签之前拟签意见内容添加至流转意见中

<font color="#FF0000">版本：weaver-workflow-core-1.64.0-hotfix64</font>


## 7.1、概述及说明

开启了组织拟签，只有在结束拟签时同步至流转意见中。此二开口子可实现结束拟签之前，意见添加至流转意见中。

## 7.2、注意事项

* 0401基线上注册的此hook，需打到weaver-workflow-core服务上。



## 7.3、二开服务增加注册hook


```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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

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


/**
 * 注册二开埋点钩子实现,结束拟签意见前是否需要添加流转意见，需要则返回true
 */
@Slf4j
@Component
@RegHook(module = "workflow", event = "wfcDraftOpinionBeforeCountersignAddRequestLog", order = 1)
public class DraftOpinionBeforeCountersignHook extends AbstractRegHookEvent {

    @Override
    public Object handle(Object[] args) throws Exception {
        log.info("DraftOpinionBeforeCountersignHook start");
        if(Objects.nonNull(args) && args.length >1){
            //拟签意见参数
            Map<String,Object> paramMap = (Map<String, Object>) args[0];
            //user对象
            WeaUser user = (WeaUser) args[1];

            log.info("paramMap:{}", JSON.toJSONString(paramMap));
            boolean result = false;
            //返回true 表示结束拟签意见前需要添加流转意见
            log.info("DraftOpinionBeforeCountersignHook tenantkey:{},result:{}",user.getTenantKey(),result);
            if("txvvgdg3u5".equalsIgnoreCase(user.getTenantKey())){
                result = true;
            }
            return result;
        }
        return false;
    }
}


```


# 八、后端口子-待阅接收人批示后跟审批人提交待办一样，当前填写/编辑的拟签意见内容变成生效


<font color="#FF0000">版本：weaver-workflow-core-1.64.0-hotfix72 和 0901基线</font>


## 8.1、概述及说明

待阅接收人从待办打开流程允许填写和编辑拟签意见（标准不支持，二开在前端放开的填写和编辑权限），当开启了拟签意见暂存状态，填写和编辑的拟签意见内容是暂存状态。

本次增加口子，跟随批示动作，前端二开传入参数，后端根据前端参数走生效逻辑。

## 8.2、前端复写拟签控件增加参数

**本口子参数代码示例**

核心是往批示请求里塞入参数：baseStore.appendSubmitExtParams({draftOpinionFieldIds})

~~~javascript

import { regOvProps } from '@weapp/utils';

regOvProps('weappWorkflow', 'DraftOpinionView', props => {
    const wffpSdk = weappWorkflow.getFlowPageSDK();
    const isRemark = wffpSdk.baseStore.commonParam.isRemark
    if(isRemark == 20){ //待阅接收人
      wffpSdk.changeDraftOpinionAttr(2);//控件改为可编辑

      const {config} = props;
      const {widgetId} = config || {};
      setDraftOpinionFieldIds(widgetId,false);
    }   
  return props;
});

/**入参：拟签控件ID、控制是否只读 */
const setDraftOpinionFieldIds = (widgetId,isReadOnly) => {
    if (!widgetId) return;
    const baseStore = weappWorkflow.getCurrentFlowPageSDK().baseStore;
    let {readOnlyIds = [],ids = []} =  baseStore?.submitExtParam?.draftOpinionFieldIds|| {};
    const draftOpinionFieldIds:any = {};
    ids.push(widgetId);
    if (isReadOnly) {
        readOnlyIds.push(widgetId)
    }
    ids = Array.from(new Set(ids)); //为当前布局里的所有拟签控件ID
    readOnlyIds = Array.from(new Set(readOnlyIds));   //为当前布局中的是所有只读的拟签控件ID
    draftOpinionFieldIds.ids = ids;
    draftOpinionFieldIds.readOnlyIds=readOnlyIds;
    baseStore.appendSubmitExtParams?.({draftOpinionFieldIds})
}

~~~


**放开拟签意见编辑示例**

注意：需先用jssdk changeDraftOpinionAttr将控件设置成编辑状态，再配合下面拦截/list请求修改isEdit=true一起使用。isEdit主要控制有没有权限修改他人拟签意见内容，且仅支持一人一条类型。

~~~javascript

import { regOvProps ,regOvComponent} from '@weapp/utils';

var fn = ()=>{
  window.axios.interceptors.response.use(function(res){
    if(res.config.url.indexOf("/api/workflow/core/draftopinion/list")>-1){
      let {data} = res.data;
      let {opinion} = data || {};
      let {onePersonOpinionRecordDTOList = []} = opinion || {};
      for (let dto of onePersonOpinionRecordDTOList) {
        if(dto){
          dto.isEdit = true; //注意：直接改响应里的参数值放开编辑权限，还自行需额外判断是不是待办流程，像已办流程就不要放开。
          dto.isDelete = true;
        }
      }
		}
		return res;
	},function(error){
		return error;
	});
}

var isrun = false;
regOvProps('weappWorkflow', 'FPMainTab', (props) => {
  if(!isrun){
    isrun = true;
    fn();
  }
  return props;
}, 0);


regOvProps('weappWorkflow', 'DraftOpinionOperateBtns', (props) => {
  props = {
    ...props,
    showQuickRecord:true
  }
  return props;
}, 0);

~~~


## 8.2、批示流程参数传入后端效果

跟流程审批人提交流程，参数及参数格式一样

![](${appMdRes}/1724659524-image.png)
