# 低代码平台节点开发：参照过滤实现指南

> **适用场景**：本文档适用于在低代码平台中开发节点时，需要对参照字段进行过滤的场景，包括固定条件过滤和自定义条件过滤。

## 1. 什么是“参照”？

**参照**是指对其他实体信息的参考和对照。它通常用于在表单中选择某个实体（如部门、人员、交易类型等）。

### 1.1 前端实现
- 通过配置 `queryCondition` 属性控制参照的界面显示。
- 通常在 `meta` 对象中设置字段的 `queryCondition`。

### 1.2 后端实现
- 拼接查询参照数据的 SQL 语句。
- 可以接收前端传入的条件并拼接到 SQL 的 `WHERE` 子句中。

## 2. 参照过滤的实现方式

### 2.1 后端可接收的过滤条件

- **固定条件**：如 `pk_org`（组织）、`parentbilltype`（单据类型）等，具体取决于参照实现时支持的字段。
- **自定义条件**：通过实现 `IRefSqlBuilder` 接口，在后端拼接 SQL 条件。

### 2.2 前端如何传递过滤条件

前端通过 `meta` 获取区域字段信息，并在字段的 `queryCondition` 属性中返回过滤条件对象。

#### 设置 `queryCondition` 的时机：
1. **`initMeta()` 方法中**：适用于静态条件。
2. **编辑后事件中**：适用于依赖其他字段值的动态条件。
3. **编辑前事件中**：适用于当前字段编辑前动态设置条件。

## 3. 常用案例

### 3.1 固定条件：交易类型按单据类型过滤

```js
// 交易类型参照过滤：根据单据类型编码过滤
meta.区域编码.items.forEach(item => {
    if (item.attrcode == "交易类型字段编码") {
        item.queryCondition = () => {
            return {
                parentbilltype: "单据类型编码"
            }
        }
    }
});
```

### 3.2 表单区：按组织过滤部门参照（三种方式）

#### 3.2.1 在 `initMeta()` 中实现

```js
// 表单区：按组织过滤部门参照
meta["form区域编码"].items.forEach(item => {
    if (item.attrcode == "pk_dept") {
        item.queryCondition = () => {
            let pk_org = this.props.form.getFormItemsValue("form区域编码", "pk_org").value;
            return {
                pk_org: pk_org
            }
        }
    }
});
```

#### 3.2.2 在编辑后事件中实现

```js
onAfterEditForm = (props, moduleId, key, value, oldValue) => {
    if (key == "pk_org") {
        let meta = this.props.meta.getMeta();
        meta["form区域编码"].items.forEach(item => {
            if (item.attrcode == "pk_dept") {
                item.queryCondition = () => {
                    let pk_org = value.refpk;
                    return {
                        pk_org: pk_org
                    }
                }
            }
        });
        this.props.meta.setMeta(meta);
    }
}
```

#### 3.2.3 在编辑前事件中实现

```js
onBeforeEditForm = (props, moduleId, key, value, data) => {
    if (key == "pk_dept") {
        let meta = this.props.meta.getMeta();
        meta["form表单区域编码"].items.forEach(item => {
            if (item.attrcode == "pk_dept") {
                item.queryCondition = () => {
                    let pk_org = this.props.form.getFormItemsValue("form表单区域编码", "pk_org").value;
                    return {
                        pk_org: pk_org
                    }
                }
            }
        });
        this.props.meta.setMeta(meta);
    }
    return true;
}
```

### 3.3 查询区：按组织过滤人员参照

```js
// 查询区：按组织过滤人员参照
meta["查询区区域id"].items.forEach(item => {
    if (item.attrcode == "pk_psndoc") {
        item.queryCondition = () => {
            let pk_org = this.props.search.getSearchValByField("查询区区域id", "pk_org").value;
            return {
                pk_org: !!pk_org && pk_org.firstvalue
            }
        }
    }
});
```

### 3.4 表格区：按组织过滤部门

```js
onBeforeEditFormlist = (props, moduleId, key, value, index, record, status) => {
    if (key == 'pk_dept') {
        let meta = this.props.meta.getMeta();
        meta[moduleId].items.forEach(item => {
            if (item.attrcode == "pk_dept") {
                item.queryCondition = () => {
                    return {
                        pk_org: record.values.pk_org.value
                    }
                }
            }
        });
        this.props.meta.setMeta(meta);
    }
    return true;
}
```

### 3.5 自定义过滤（实现 `IRefSqlBuilder` 接口）

#### 后端类示例

```java
package nccloud.web.lcdp.extenddev.extenddevmaster.action;

import java.util.Map;
import nccloud.framework.web.processor.IRefSqlBuilder;
import nccloud.framework.web.processor.refgrid.RefQueryInfo;
import nccloud.framework.web.ui.meta.RefMeta;
import nccloud.pubitf.platform.db.SqlParameterCollection;

public class TreeRefSqlBuilder implements IRefSqlBuilder {

    @Override
    public String getExtraSql(RefQueryInfo para, RefMeta meta) {
        Map<String, String> params = para.getQueryCondition();
        String code = params.get("code");
        if (code != null && !"".equals(code.trim())) {
            return "code = '" + code + "'";
        }
        return null;
    }

    @Override
    public SqlParameterCollection getExtraSqlParameter(RefQueryInfo para, RefMeta meta) {
        return null;
    }

    @Override
    public String getOrderSql(RefQueryInfo para, RefMeta meta) {
        return null;
    }
}
```

#### 前端配置

```js
// 表单区：自定义过滤部门参照
meta["extenddevMasterForm"].items.forEach(item => {
    if (item.attrcode == "pk_dept") {
        item.queryCondition = () => {
            let pk_org = this.props.form.getFormItemsValue("extenddevMasterForm", "pk_org").value;
            return {
                pk_org: pk_org,
                code: "22",
                TreeRefActionExt: "nccloud.web.lcdp.extenddev.extenddevmaster.action.TreeRefSqlBuilder"
            }
        }
    }
});
```