

### e-Builder内部tag定位应用和表单

#### 一. 说明

       随着应用迁出迁出应用id和表单id也会随之发生变化，导致应用、表单切换到其他环境后原始配置、开发逻辑跟应用id、表单id相关信息需要重新适配调整。因此增加应用和表单打标签逻辑，可在开发环境针对自己搭建和开发的EB应用打tag， 配置或开发逻辑中通过tag反找对应appId、objId等信息完成后续逻辑，避免应用包安装后需要适配的问题

    通过打标签可解决跨环境表名/表单id不一致二开逻辑或业务需要调整问题

###### **注意**：

		打了同一个标签的应用， 如果同一个租户有多次新增导入的情况，tag获取到的appId可能是多个。这个是tag策略没有办法解决的， 只能由业务上想办法处理该场景。需要根据业务场景判断是所有对应的appId都做处理还是只处理最新导入的应用亦或者手动保证当前tag只存在一个应用(手动保证tag唯一)

		表单维度获取的前提是需要传入appId， 因此可以找到唯一表单，无此问题

#### 二. 如何获取应用和表单id

可通过以下两种方式获取应用和表单id:

[图片附件未整合: ../../../../_assets/801348525791846401/001-c82cf68e31.png]

- 访问\[低代码平台e-Builder\]，访问具体应用中\[表单\]标签下，点击选中对应表单后，可直接根据路由上的参数值确认对应应用id(appId) 和表单id(objId)

[图片附件未整合: ../../../../_assets/801348525791846401/002-39e85eb256.png]

- 访问\[低代码平台e-Builder\]，访问具体应用中\[表单\]标签下，点击选中对应表单后，可通过表单\[基本信息\]右侧扩展信息(三个点)中\[数据表结构\]功能获取当前表单id(objId)和应用id(appId)

#### 三. 接口操作方式说明

##### 3.1. 应用标签设置及根据标签获取应用

```xml
引入ebuilder-app 应用层对外api包

<dependency>
    <groupId>com.weaver</groupId>
    <artifactId>weaver-ebuilder-app-api</artifactId>
</dependency>
```

###### 3.1.1 rpc接口说明

```json
给应用打标签:
com.weaver.ebuilder.app.api.rest.AppRest.updateAppTag(Long appId, String tag, String tenantKey) 
	-- appId 应用id
	-- tag 应用标签
	-- tenantKey 租户key

根据tag获取应用id:
WeaResult<List<Long>> getAppIdsByTag(String tag, String tenantKey)
	-- tag 应用标签
	-- tenantKey 租户key
```

###### 3.1.2 rest接口说明

> 注意: app更新接口需要指定 Conetnt-type:multipart/form-data

```json
根据应用id更新tag
POST: /api/bs/ebuilder/app/tags/updateAppTag
	param:
		-- appId 应用id
		-- tag  标签名称
	return:
		boolean 更新状态
	
根据tag和应用id获取表单列表
GET: /api/bs/ebuilder/app/tags/getAppIds
	param:
		-- tag  应用标签
	return:
		-- List<Long> 对应标签的应用ids
```

##### 3.2. 支持对表单打tag以及根据tag获取当前应用下对应表单

```xml
引入ebuilder-form-client 表单层对外api包

<dependency>
    <groupId>com.weaver</groupId>
    <artifactId>weaver-ebuilder-form-client</artifactId>
</dependency>
```

###### 3.2.1 rpc接口说明

> 注意: eb表单需添加group为ebuilderform，对应使用方式为 @RpcReference(group = "ebuilderform")

```json
// 根据表单id更新tag
com.weaver.ebuilder.form.client.service.obj.RemoteEBObjService#updateObjTag(Long objId, String tag, String tenantKey)
	-- objId 表单id
	-- tag  表单标签
	-- tenantKey 租户key
	
// 根据tag和应用id获取表单列表
com.weaver.ebuilder.form.client.service.obj.RemoteEBObjService#getObjsByTag(Long appId, String tag, String tenantKey)
	-- objId 应用id
	-- tag  表单标签
	-- tenantKey 租户key

// 根据eb表单id获取表单配置
com.weaver.ebuilder.form.client.service.obj.RemoteEBObjService#getObjInfo(Long objId, String tenantKey)
	-- objId eb表单id
	-- tenantKey 租户key
```

###### 3.2.2 rest接口说说明

> 注意：校验有应用的编辑权限才支持打tag

```json
根据表单id更新tag
POST: /api/ebuilder/form/obj/updateObjTag
	param:
		-- objId 表单id
		-- tag  表单标签
	return:
		boolean 更新状态 (注意:返回的是weaResult包装结果,需要看data属性返回的boolean状态)

	
根据tag和应用id获取表单列表
GET: /api/ebuilder/form/obj/getObjsByTag
	param:
		-- appId 应用id
		-- tag  表单标签
	param:
		-- List<Obj> 对应标签的表单集
```

#### 四. sql操作方式说明

```sql
## sql方式根据标签查询逻辑为:

# 1. 根据应用标签和租户key获取当前租户下对应标签的应用
#   - 如果非单体项目，对应 weaver-ebuilder-app-service.properties 配置文件中数据库实例
select id from ebda_app where tag = '{appTag}' and tenant_key = '{tenantKey}'

# 2.根据应用id和表单tag获取当前租户下对应表单id和表名
#   - 如果非单体项目，对应 weaver-ebuilder-form-service.properties 配置文件中数据库实例
select id, table_name from ebdf_obj where tag = '{objTag}' and tenant_key = '{tenant_key}' and app_id = '{appId}'

# {appTag} : '应用标签'
# {objTag} : '表单标签'
# {tenantKey} : '当前租户key'
# {appId} : '应用id, ebda_app#id'

# sql更新tag方式，只需按照上述方式找到对应应用和表单更新对应tag字段即可
```
