yonbip-code-gen-mcp
Version:
YonBIP高级版代码生成MCP
201 lines (166 loc) • 6.05 kB
Markdown
# 低代码平台节点开发:参照过滤实现指南
> **适用场景**:本文档适用于在低代码平台中开发节点时,需要对参照字段进行过滤的场景,包括固定条件过滤和自定义条件过滤。
## 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 {
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;
}
public SqlParameterCollection getExtraSqlParameter(RefQueryInfo para, RefMeta meta) {
return null;
}
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"
}
}
}
});
```