# 操作插件

## 插件模版

- 操作插件开发使用插件基类模版： `kd.bos.entity.plugin.AbstractOperationServicePlugIn`  

- 实现接口`kd.bos.entity.plugin.IOperationServicePlugIn


## 场景和示例

### 调用操作事务开始/结束（事务内）事件

场景：操作的事务开始后--操作执行之前发生。

```java
public void beginOperationTransaction(BeginOperationTransactionArgs e) {
    DynamicObject[] dataEntities = e.getDataEntities();
    for (DynamicObject dataEntity : dataEntities) {
        String str = dataEntity.getString("voucherNo");
        //...
        dataEntity.set("materialNo", "");
        //this.getOperationResult().getSuccessPkIds().clear();
        //终止操作
        e.setCancelOperation(true);
    }
}

public void endOperationTransaction(EndOperationTransactionArgs e) {
    if (needSaveEditObject != null) {
        SaveServiceHelper.save(new DynamicObject[]{needSaveEditObject});
    }
}
```

### 页面值绑定事件

场景：设置操作校验器

```java
public void onAddValidators(AddValidatorsEventArgs e) {
    super.onAddValidators(e);
    e.getValidators().add(new MySaveValidator());
}

//自定义校验器，继承AbstractValidator。对数据进行校验
public class MySaveValidator extends AbstractValidator{
    @Override
    public void validate() {
        //遍历单据校验
        for (ExtendedDataEntity dataEntity : dataEntities) {
            DynamicObjectCollection entryentity = (DynamicObjectCollection) dataEntity.getValue("entryentity");
            //....
            //if()
            //addWarningMessage addFatalErrorMessage addMessage
            addErrorMessage(dataEntity, "my error message");
            return;
            //else
        }
    }
}
```

### onPreparePropertys示例

场景：准备操作对象实体属性事件，在此事件中可以将校验过程需要的属性对应的Key添加进来以便统一从数据库中加载数据。

```java
@Override
public void onPreparePropertys(PreparePropertysEventArgs e) {
    List<String> fieldKeys = e.getFieldKeys();
    fieldKeys.add("booktype");
}
```



**执行时间前后事件**

场景：执行操作事务前/后事件，通知插件对要处理的数据进行排序等预处理。

```java
@Override
public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
    DynamicObject[] dataEntities = e.getDataEntities();
    existIds = new HashSet<>();
    for (DynamicObject initBalance : dataEntities) {
        //TODO
    }
}
```

## API概览

`AbstractOperationServicePlugIn`  

| 方法名称                          | 说明                                                         |
| --------------------------------- | ------------------------------------------------------------ |
| getOperationResult                | 获取操作结果                                                 |
| beforeExecuteOperationTransaction | 执行操作事务前事件，通知插件对要处理的数据进行排序等预处理。 |
| afterExecuteOperationTransaction  | 执行操作事务后事件，通知插件对要处理的数据进行排序等预处理。 |
| onAddValidators                   | 通过此事件，通知插件进行添加自定义数据校验器                 |
| beginOperationTransaction         | 调用操作事务开始（事务内）                                   |
| endOperationTransaction           | 调用操作事务结束（事务内）                                   |
| onPreparePropertys                | 准备操作对象实体属性事件，在此事件中可以将校验过程需要的属性对应的Key添加进来以便统一从数据库中加载数据 |
| getOption                         | 操作自定义参数                                               |

## 配置方式

- 在页面设计中选中主实体，在属性栏点击操作属性进入操作编辑界面

  ![package](image\kz_op_1.png)

  

- 可以编辑已有的操作或者新增操作
  ![package](image\kz_op_2.png)
	

  - 新增操作

    - 点击新增按钮进入新增操作界面
    ![package](image\kz_op_3.png)
  
- 选择操作类型

  ![package](image\kz_op_4.png)
	

- 系统根据不同的业务场景内置有丰富的操作，选择一个已有的操作类型添加新来

  ![package](image\kz_op_5.png)

  - 操作配置

    - 点击一个已有的操作，点击修改即可进入编辑界面

  ![package](image\kz_op_6.png)

- 可对操作的参数和相关控制进行配置，主要是配置操作校验器和插件等

  ![package](image\kz_op_7.png)

