查询数量组件
查询数量组件(DbQueryCount)用于统计满足条件的实体记录数量。
概述
查询数量组件按筛选条件统计目标实体的记录条数并返回计数结果,常用于分页总数计算、条件校验、看板指标等场景。
查询条件使用统一的「基础 / 高级」编辑模式(详见 全局属性),默认条件过滤掉已删除数据。
配置项
| 配置项 | 说明 |
|---|---|
| 操作对象 | 要统计的实体对象,必填 |
| 默认条件 | 统计的筛选条件,支持基础模式与高级模式 |
| 输出到最终结果 | 开启后该组件结果作为接口返回值 |
默认条件
默认条件通过分栏切换「基础 / 高级」两种模式:
| 模式 | 值(ConditionMode) | 说明 |
|---|---|---|
| 基础 | basic | 界面逐项配置,单层「并且 / 或者」 |
| 高级 | advanced | 直接编辑条件 JSON,支持嵌套 |
默认条件模板为过滤未删除数据:
{
"Field": "isdeleted",
"Operator": "eq",
"Value": false
}
使用场景
- 分页总数计算
- 存在性校验(数量是否为 0)
- 看板指标统计
下一步
属性明细
以下内容面向技术实现与 AI 检索,说明查询数量组件的节点元数据。
节点元数据
查询数量组件由 FlowCmpType.DbQueryCount 标识。所有节点 meta 值均以字符串存储(布尔、数字、数组等在元数据中同样以字符串形式保存)。
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "DbQueryCount" |
MetaObjectId | string(GUID) | 目标实体对象 | 缺省取当前接口所属对象 |
DefaultFilter | string(JSON) | 高级模式的默认条件 | 条件 JSON,缺省为 isdeleted = false 模板 |
BasicFilter | string(JSON) | 基础模式的默认条件 | 条件 JSON |
ConditionMode | string | 条件编辑模式 | "basic"(缺省)/ "advanced" |
IsFinalResult | string(bool) | 是否输出到最终结果 | "true" / "false" |
IsDisabled | string(bool) | 是否禁用该节点 | "true" / "false" |
order | string | 同级排序 | 例:"9" |
元数据存储示例
{
"ID": "count1",
"type": "DbQueryCount",
"MetaObjectId": "3f9c0b2e-2d3a-4e6f-9c11-0f7a5b8d2e10",
"ConditionMode": "basic",
"BasicFilter": "{\"Logic\":\"And\",\"Filters\":[{\"Field\":\"isdeleted\",\"Operator\":\"eq\",\"Value\":false}]}",
"IsFinalResult": "true",
"order": "9"
}
服务端执行逻辑
本节说明 DbQueryCountComponentManager 在服务端的真实执行过程。组件继承自 TriggerComponentManagerBase,接口链路与实体触发器链路均会执行。
执行时机与场景
- 执行入口为
_ExecuteAsync,只做条件计数,不返回数据行,执行后调用ExecuteNextAsync继续下游。 - 基类执行前读取
IsDisabled,为"true"时跳过本组件。
查询条件组装
条件组装优先级自高到低:
context.FilterOverride(最高优先):一旦赋值,覆盖其他所有条件。- 否则以空条件为基底,依次 AND 拼接:
- 默认条件:由
ConditionFilterResolver.ResolveAsync(ConditionMode, DefaultFilter, BasicFilter, ctx)解析。ConditionMode="basic"时读取BasicFilter并按值类型解析;其他情况按「高级模式」反序列化DefaultFilter。 request.Condition:请求体传入的条件(与查询集合不同,数量组件在默认条件之后拼接请求条件)。context.AndFilter:链路按需插入的额外 AND 条件。
- 默认条件:由
与查询集合不同,数量组件不执行 {Env.*} / {Model.*} 默认值占位符替换。
权限过滤
- 查询操作权限:除非
SkipOperationPermission生效,否则调用VerifyPermissionAsync(Query)校验MetaObjectDataOperationType.Query,无权限直接抛出NoPermissionAccess。 - MOU(数据)权限:除非
SkipMouPermission生效,否则通过CombineDataPermissionFilterAsync(context, metaObject, filter, MouPermissionStageEnum.Query)把 MOU 过滤条件以 AND 方式拼接。SkipOperationPermission取自节点meta或context.DicParam;SkipMouPermission仅取自context.DicParam。
执行与 SQL 形态
计数直接交由数据访问层生成并执行:
var result = await chameleonDbContext.GetCountAsync(metaObject.Code, filter);
即 IChameleonDbContext.GetCountAsync(集合名称, filter),对应 COUNT 语义;无跨对象(lookup)分支、无排序、无分页。
输出与上下文
| 输出项 | 内容 |
|---|---|
context.CmpResult | long 计数结果 |
context.DicParam["MetaObjectCode"] | 对象编码 |
context.DicParam["MetaObjectId"] | 对象 ID |
当 IsFinalResult="true" 时,写入 context.TransferResult.Total,并赋值 context.Result = ResponseResult<long>.Success(result)。
性能与限制
- 仅执行一次
COUNT查询,无分页与结果翻译开销。 - 组件递归深度上限 100,超过抛出异常。
异常与校验
校验阶段(_VerifyAsync):
| 场景 | 异常 |
|---|---|
MetaObjectId 为空 | OperationObjectNotFound |
| 对象不存在 | MetaObjectNotFoundById |
执行阶段:
| 场景 | 异常 |
|---|---|
| 无查询操作权限 | NoPermissionAccess |