1 - 三方实体场景案例
场景描述
- 列表数据来源于三方异构系统,比如请购单列表数据来源于yonBIP系统。
- 详情页面数据来源于三方异构系统,比如请购单详情数据来源于yonBIP系统。
- 实体中参照数据来源于三方系统,比如采购付款单上,关联选择请购单,请购单数据来源于三方。
运行效果
- 请购单列表
- 请购单列表穿透查看请购单详情,详情数据
- 采购付款单选择关联请购单,请购单来自yonBIP系统。
操作步骤
前提
已在集成连接模块配置好对应的集成接口。
三方系统 | 接口名称 | 接口地址 | 接口文档 |
---|---|---|---|
yonBIP | 请购单列表查询 | /yonbip/scm/applyorder/list | 请求参数:Body部分中有分页查询参数和排序参数及其动态扩展条件查询参数。 即接口支持分页查询。 返回参数:返回参数中包含分页信息及其总记录数信息,以及返回列表数据。 |
yonBIP | 请购单详情查询 | /yonbip/scm/applyorder/detail | 请求参数: 返回参数:请购单详情接口会返回请购单主信息及其请购单子表信息。 |
注意事项
- 列表查询接口重点关注是否支持分页查询、查询条件设置、排序设置,因为这意味着需要传递给三方需要查询的分页数据、查询字段、排序规则,且接口返回的列表也是符合查询条件、排序规则的当前页数据。
- 详情查询接口重点关注返回数据是否有主子孙结构数据,因为需要考虑详情单据对应子孙数据逻辑处理。
核心逻辑
- 在应用中创建同字段的三方实体;
- 创建的三方实体会自动生成需要的微流程,设计师在微流程中调用三方接口,把三方接口返回的数据输出;
- 页面上绑定三方实体的重复表查询控件会自动调用自动生成的对应微流程返回的数据展示。
第一步
-
应用添加依赖,依赖对应的集成应用。
第二步
-
新建三方实体“ 请购单 “,在对应分组下点击“ + “按钮,勾选中”第三方实体"属性。
-
新建“请购单bip"实体的字段,demo案例,仅做10个字段做演示使用。(注意:字段类型和三方接口返回类型一致,如不一致则需要做类型匹配处理)
-
如果三方实体唯一ID是文本类型,则需要再唯一列上勾选设置为”唯一”,见上图。
-
-
新建三方实体” 请购明细”,在对应分组下点击“ + “按钮,勾选中”第三方实体"属性。 说明:三方实体目前不支持子实体,所以同样是新建三方实体用来对应子实体结构,此时则需要在明细对应的三方实体中新建”请购单bip"的id字段。
-
同理新建"请购明细bip"实体的字段,添加了“请购单id"字段和”请购明细id”,并设置“请购明细id"为唯一字段。
-
如果明细需要展示行号,且三方接口有返回行号,可在明细实体中新增字段”行号"字段。
-
-
自动生成微流程
新建的三方实体会自动生成对应的微流程,进入「规则—微流程」菜单下,可见对应实体的微流程,每个三方实体会自动生成4个微流程。
- 【预制】根据ID查询{三方实体名称}
- 【预制】动态查询{三方实体名称}
- 【预制】根据ID集合查询{三方实体名称}集合
- 【预制】动态查询{三方实体名称}的总数
第三步
配置请购单列表:请购单列表数据获取会自动调用生成的微流程:【预制】动态查询请购单bip,并将该微流程的请购单列表数据给到页面。
新建请购单列表
-
进入「菜单」列表页面,以Web端为例,点击「菜单」添加按钮,添加菜单,输入菜单名称“请购单bip列表"
-
选中菜单新建页面,输入页面名称”请购单bip列表",选择页面类型为“列表类型",选择页面对应实体未”请购单bip",选择页面模板为“重复表查询"。
-
生成的页面见附图:
-
预制的”重复表查询"模板中设置了穿透查看详情页面,此时先删除的对应的重复表事件相关配置。 ①选中页面上新建按钮,在右侧属性「事件」页签中点击「删除」按钮,删除新建按钮对应的事件配置。
②选中页面上“重复表查询"控件,在右侧属性「事件」页签中对应事件点击「删除」按钮,删除新建按钮对应的事件配置,然后点击页面右上角「保存」按钮,页面保存成功
-
因为三方列表查询接口支持分页、查询条件和排序设置,按照业务需要对应设置: ①因为使用了页面模板,列表控件自动绑定了对应”请购单bip"实体,并且自动生成了部分列字段,可根据需要进行列字段的调整设置:
②启用分页
[预制]动态查询请购单bip微流程
修改【预制】动态查询请购单bip逻辑,主要在该预制微流程中添加调用yonBIP接口:请购单列表查询接口,以便从三方获取到对应的列表数据。
- 创建的请购单bip列表页面中的列表,因为配置的是”请购单bip实体",会自动调用该微流程“【预制】动态查询请购单bip"。
- 该预制微流程中,自动预制了一个节点”请购单bip的列表"变量节点,节点内容是空的,输出的时候会输出该列表,该微流程输出的列表就会直接反映到上面的“请购单bip列表"页面。 下图中结束节点输出的”分页数据",与前台“请购单bip列表"页面对应的分页数据对应,从前台列表页面点击跳转的第几页,会预制自动传递给该微流程,该微流程可获知是要查询的是第几页数据。
- 点击”编辑"按钮,编辑微流程。
-
在开始节点后添加一个”分页对象"类型变量,并把预制微流程传递的参数‘“赋值给它,以便后续可从该分页对象中获取前台页面传递的分页信息,并传递给接口。
-
三方接口查询参数是动态扩展的,我们需要组装成三方接口需要的动态查询参数。 接口文档中关于动态查询参数部分。
①创建一个动态查询参数类型的列表变量,因为接口标识是数组类型。一个查询字段是一条,多个是多条。
②组装查询条件内容:以请购单编号为例,创建一个扩展条件查询对象变量
第一个赋值参数是比较符,接口中明确的比较符是 “eq"等于。
第二个值字段需是前台列表页面客户输入的查询值,需要从前台页面传递的查询参数中获取:
前台页面传递的动态查询条件中字段的查询值:目前请通过下拉方式,即使用下图方式展开赋值,暂时不要用表达式赋值。
第三个“属性名"字段是三方接口中字段的编码:请购单编号对应的接口文档编码是code,所以field直接设置值固定为“code”。
出参名称和节点名称同步更改
③把准备好的“请购单编号查询对象"添加到”扩展条件查询列表"变量中。
注意:查询条件前台最终用户可能不会输入查询值,此时从页面上获取到的查询值是空值,如果三方查询接口对空值有自动处理,则不需要单独处理,如果三方查询接口没有做处理,则需要在逻辑中对查询空的情况添加条件处理。
在”请购单编号"查询变量前添加“分支"节点,判断”请购单编号查询值"不为空时,把“请购单查询"变量和”“修改的动态条件扩展变量““挪到不为空分支内。
④其他查询值参考”请购单编号"方式进行设置,在此不做演示。
⑤同理组装排序参数。排序参数也是列表类型动态的,如下图。
创建一个“排序对象"类型的列表变量。
创建”排序字段"类型的对象,并赋值:
添加修改列表节点,将请购单编号排序设置字段加入到排序列表变量中。
-
添加”服务”
配置入参1:页码传递,从前台列表页面的当前页数传递。
注意:V8列表传递的当前页数是从1开始,如果三方也是从1开始,则不需要处理;如果三方是从0开始,则用前台传递的当前页数减1再传递给三方接口。
配置入参2:每页记录数,从前台列表页面的当前页数传递。
说明:每页记录数需要使用从前台列表页面传递的值,是因为最终用户可能会切换每页记录数,比如从10切换为100。
配置入参3:排序字段,将组装的排序字段列表变量对应赋值。
配置入参4:排序字段,将组装的排序字段列表变量对应赋值。
-
把“请购单列表查询"接口返回的内容,解析处理。
- 可任意添加一个节点,看一下接口出参的结构。比如添加一个”分支"节点,确定结构后可删除该节点。
-
按照以上出参结构,需要创建一个同结构对象变量接收“data”。
-
添加“数据转换"节点,可一次性把请购单出参中““请购单列表”“数据转换到”请购单"实体对应的列表数据。
属性设置1:来源数据设置
属性设置2:实体对象—当前应用下—请购单bip实体。
-
”请购单列表查询"接口返回了总页数和总记录数,需要返回给到“请购单列表"页面对应的分页对象中,因为总共多少条数据,和总页数都需要三方返回。 添加”修改变量"节点,修改分页对象,把三方返回的总页数和总记录数进行更新。
总记录数设置:点击参数映射右侧输入框”+“号。
-
最后添加“修改列表"节点,把映射后的”请购单列表"数据赋值给默认的“请购单列表"变量。
-
结束节点,出参更新设置:分页对象更改设置。
[预制]动态查询请购单的总数微流程
对于三方实体”请购单列表"页面中,如果开启了统计数属性,且筛选方案设置了至少2个时,见下图属性,则该统计数的数值来源是通过调用“[预制]动态查询请购单的总数"微流程获取到的。
即如果列表没有配置筛选方案则不需要配置此微流程。
此时需要配置”[预制]动态查询请购单的总数"微流程逻辑。
-
预制节点和输入、输出内容:
点击「编辑」按钮,编辑该微流程。 入参:点击预制的节点“查询的总数"节点,按照下图操作可查看输入时”请购单bip的动态查询条件”。即筛选方案中或者列表前台页面中可以设置的查询条件。 对应返回的总数,如果前台页面有搜索条件,返回的总数会动态变化,所以有该查询条件对象。 预制“查询的总数"整数类型变量节点,同时作为结束节点的出参。
-
如三方有对应单独的查询总数的接口,则微流程配置对应查询总数的接口,如在查询列表接口中可返回总数,则调用列表查询接口得到总数。
快捷窍门:如是通过查询列表接口中可返回总数,且已经配置了”[预制]动态查询请购单bip"微流程,可直接去“预制]动态查询请购单bip"复制对应节点。 如果没有配置[预制]动态查询请购单bip微流程,则见”[预制]动态查询请购单bip微流程"部分查询条件设置部分。 注意:过滤条件要按照自己实际情况进行配置哈,此处仅为演示能力。
回到”[预制]动态查询请购单bip"微流程中,进入编辑状态,勾选“扩展条件查询列表相关节点”,见如下附图。
- yonBIP没有单独按照查询条件查询总数的接口,所以我们直接使用列表查询的接口。 添加”自定义服务"节点,配置调用“请购单列表"查询接口。
因为yonBIP列表查询接口有必填参数页面和每页条数,这里我们可以偷懒给页面和每页条数默认设置1,和20,因为该微流程仅用来查询没有切换到的筛选方案的总数。
-
接口返回数据,需要创建同结构变量进行接收。
-
把接口查询到的总数复制给预制的整数变量”查询的总数"变量。
运行效果
-
运行页面:
-
可通过日志查看微流程是否执行。
第四步
配置请购单详情页面,以便从请购单列表穿透到请购单详情页面。请购单详情页面获取会自动调用生成的微流程:【预制】根据ID查询请购单bip微流程,并将该微流程的请购单详情数据给到详情页面。
新建请购单详情页面
-
进入「菜单」列表页面,以Web端为例,在菜单“请购单bip列表"下添加详情页面。
-
请购单详情,会有请购明细,在页面上添加请购明细。 拖拽”重复表查询"控件到详情页面中。
重复表查询控件绑定“请购明细bip"实体,并设置相关属性。请购单详情查询接口中返回请购明细数据,明细无分页信息,所以控件不设置分页和对应查询内容。
说明:请购明细展示不展示子表id和主信息id,所以对应字段可设置对应隐藏字段。
因为三方实体不支持主子结构,所以请购单和请购明细是创建的两个没有关系的实体,所以可以把请购明细当成独立的三方列表去获取,只不过获取的是当前请购单详情的请购明细数据。
选中重复表查询控件,设置过滤条件为”请购单ID=页面入参.ID”,因为是从请购单列表穿透到详情页面的,所以请购单ID从列表页面传递过来。
[预制]根据ID查询请购单bip微流程
修改【预制】根据ID查询请购单bip微流程逻辑,在“请购单详情页面"中,请购单详情主信息的数据通过调用该微流程获取到。
预制微流程内容。
-
预制输入:点击编辑,通过后续节点可知晓输入内容是:实体ID,见附图。
-
预制节点:”请购单bip"变量节点,节点内容是预制是空的,类型是实体对象:”请购单bip”,同时该节点会作为输出内容。
预制输出:
配置微流程逻辑,主要在该预制微流程中添加调用yonBIP接口:请购单详情查询接口,以便从三方获取到对应的详情数据。
注意:如果三方唯一标识不是长整数类型,则不需要如下节点配置,否则需要按照如下配置进行。、
-
前提:实体上对应唯一标识字段需要设置为唯一。
-
添加节
参数入参设置:
出参描述说明:是“请购单bip"实体设置的唯一标识字段。
设置节点出参名称:
-
添加”自定义服务"节点,配置调用“请购单详情查询"接口。
-
创建同结构对象变量接收接口返回内容。
-
计划
[预制]动态查询请购明细bip微流程
补充说明(常见问题)
demo文件
2 - 页面场景案例
2.1 - 下拉控件中可选内容分组展示或者层级展示案例
场景描述
如下附图,下拉可选内容按照层级展示或者多级选择的场景需求。
场景1附图 | 场景2附图 |
---|---|
操作步骤
-
新建多级枚举
按照业务新建枚举项:
点击新建:[或直接下载导入样例数据](image/_index/dizhienmu2024-06-25 14-09-19zx.xlsx)
-
在对应的实体中新建字段,字段选择枚举类型,并绑定对应的多级枚举
-
页面上控件绑定该枚举类型字段即可
-
如果按照场景2中效果,上级数据比如”单位1、单位2、单位3"仅用作层级展示,不可选择,则找到对应下拉控件并设置属性:“必须选择末级节点"设置为开启
运行效果
3 - 后端组件开发案例
场景描述
在我们使用低代码平台搭建应用的过程中,常常存在不同的应用需要使用到同一个底层组件能力,这就需要使用后端自定义组件了,本案例讲了以下几个和后端自定义组件开发相关的问题:
- 如何开发一个后端组件(starter)?
- 如何将开发好的组件注册到环境中?
- 多个不同的低代码平台应用如何使用组件中提供的能力?
如何开发一个后端组件(starter)
可以参考boot-starter-demo项目编写一个starter,【下载案例】。
- 拿到此demo之后解压,可以用idea File->New->Project from Existing Sources…导入到工具中
- 导入的时候选择解压出来的pom文件即可
- 导入之后,需要根据项目实际情况配置合适的maven settings.xml确保本demo中的依赖包能够从maven仓库中拉取到
- 根据项目需要调整demo中的包路径,本demo的包路径是com.seeyon.boot.starter.demo
- 组件的pom中parent版本调整,根据项目实际情况调整boot的版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.seeyon</groupId>
<artifactId>boot-starter-demo</artifactId>
<version>1.0.2</version>
<packaging>jar</packaging>
<parent>
<groupId>com.seeyon</groupId>
<artifactId>boot</artifactId>
<!-- parent的版本号可以根据实际情况进行调整 -->
<version>3.9.5</version>
</parent>
<dependencies>
<dependency>
<groupId>com.seeyon</groupId>
<artifactId>boot-starter-appservice</artifactId>
</dependency>
<dependency>
<groupId>com.seeyon</groupId>
<artifactId>boot-starter-web</artifactId>
</dependency>
<!-- 根据项目实际情况可以添加其他依赖jar包 -->
</dependencies>
</project>
6、调整src/main/resources/metadata/starter_info.json
{
"name":"boot-starter-demo",
"caption":"boot-starter-demo.caption",
"basePackage":"com.seeyon.boot.starter.demo",
"type":"2"
}
name: 对应pom中
caption: src/main/resources/i18n下的一个组件名称国际化key;
basePackage:组件基础包路径;
type:{1:预制组件,2:自定义组件},项目上自定义的组件就写2;
7、在编写appService实现类的时候,注意区分接口是否要暴露为openApi,如果需要暴露为openApi,可以在方法的@AppServiceOperation注解上添加openApi = @OpenApi(isOpenApi = true)属性,需要特别注意的是依赖了当前后端组件的低代码应用的后端微流程可以直接调用组件中暴露为openApi的接口,例如:
package com.seeyon.boot.starter.demo.appservice;
import com.seeyon.boot.annotation.AppService;
import com.seeyon.boot.annotation.AppServiceOperation;
import com.seeyon.boot.annotation.OpenApi;
import com.seeyon.boot.transport.SingleRequest;
import com.seeyon.boot.transport.SingleResponse;
import com.seeyon.boot.starter.demo.api.StudentAppService;
import com.seeyon.boot.starter.demo.domain.service.StudentService;
import com.seeyon.boot.starter.demo.dto.StudentDto;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Description:
* Author: weijh
* Date: 2024/11/12 10:45
*/
@AppService
public class StudentAppServiceImpl implements StudentAppService {
@Autowired
private StudentService studentService;
/**
* 根据学生姓名查询学生信息,注意openApi = @OpenApi(isOpenApi = true) 意味着这个接口开放了openApi
* @param request
* @return
*/
@Override
@AppServiceOperation(value = "学生信息", description = "通过姓名查询学生信息", returnValue = "学生信息", openApi = @OpenApi(isOpenApi = true))
public SingleResponse<StudentDto> selectStudentByName(SingleRequest<String> request) {
StudentDto studentDto = studentService.selectStudentByName(request.getData());
return SingleResponse.from(studentDto);
}
}
如何将开发好的组件注册到环境中
1、开发好组件之后,如果您有maven仓库相关权限可以使用maven deploy命令,将组件对应的版本发布到项目对应的maven仓库中。也可以本地install之后,将jar包拿给项目上的maven仓库管理员手动上传到maven仓库中。
2、登录V8环境上的system-admin账号,找到基础设置->组件管理->后端组件
3、根据组件pom中的group、artifactId、版本以及版本类型(分release版和快照版)进行组件注册
多个不同的低代码平台应用如何使用组件中提供的能力
1、在注册了组件的环境低代码平台应用组件依赖中按需添加后端组件依赖
2、应用的后端微流程或者手写代码就可以调用到组件的接口 比如在后端微流程中调用组件中的openApi接口:
4 - 微流程场景案例
4.1 - 微流程分页查询&批量更新案例
场景描述
以查询供应商数据为例:
由于供应商的数据量特别多,我们无法通过微流程一次性将所有供应商的数据查询出来,因为查询多条数据微流程节点最多只允许查询999条(其实也不建议一次从数据库中查询过多数据出来,因为那样可能会导致服务jvm内存暴增,从而导致内存溢出的情况出现),所以我们需要分页查询供应商数据,查询一页数据再更新一页数据。
分页查询、更新的逻辑是:
- 一共有几页数据,则依次从第一页查询到最后一页。
- 查询对应分页数据,则更新对应分页数据。
操作步骤
-
在新建微流程之后,新增第一个节点”查询多记录"节点,配置查询供应商实体,目的是查询满足条件的”供应商"总记录数。
-
创建一个”整数"类型的变量“分页变量1”,用来设置每页记录数,并且给一个默认值,此处我们给10,您可以根据实际场景适当调整此默认值大小。
-
创建一个“小数类型"的变量,用来计算总页数的中间变量,因为按照总记录数计算,可能最后一页记录数不够一页。
-
创建一个“分页对象类型"的变量,并设置好对应的”总记录数",“总页数",”每页记录数",为以后分页查询时使用做准备。
-
添加一个”计数循环"的节点,按照总页数进行循环,循环变量就是要查询的页码。
-
在循环中,修改“分页对象"的当前页数,值为循环对应的页码。
-
在循环中,继续添加”查询多记录"的节点,目的的是查询当前页码对应的供应商数据。
-
上一步骤查询对应页码的供应商数据后,需要更新当前页的供应商数据,则添加一个“列表循环",循环刚查出来的供应商分页数据。
-
然后在供应商列表循环中,添加”修改变量"的节点,按照规则设置单个供应商要更新的内容,比如供应商合作期限等,具体更新内容以业务实际情况为准,此处仅为演示能力逻辑更新供应商编码为“更新了供应商编码"
更新内容和更新逻辑按照业务需要进行编写,此处仅为演示更新单个信息时如何使用微流程搭建实现。
-
最后分页更新供应商列表数据,在每页的循环中进行批量更新对应页的列表数据。
-
-
为在前台可见更新效果,新建了菜单页面:
-
供应商维护列表,先准备供应商数据。
-
供应商分页更新页面,点击按钮调用进行分页数据更新。 先创建供应商列表批量更新的页面,仅为查看demo效果和进行demo操作。
准备页面规则以便调用后端微流程进行分页查询和更新操作。
-
列表上添加「}多记录批量更新」的按钮,点击按钮配置对应的执行事件。
-
运行效果