Skip to main content

查询数量组件

查询数量组件(DbQueryCount)用于统计满足条件的实体记录数量。

概述​

查询数量组件按筛选条件统计目标实体的记录条数并返回计数结果,常用于分页总数计算、条件校验、看板指标等场景。

查询条件使用统一的「基础 / 高级」编辑模式(详见 全局属性),默认条件过滤掉已删除数据。

配置项​

配置项说明
操作对象要统计的实体对象,必填
默认条件统计的筛选条件,支持基础模式与高级模式
输出到最终结果开启后该组件结果作为接口返回值

默认条件​

默认条件通过分栏切换「基础 / 高级」两种模式:

模式值(ConditionMode)说明
基础basic界面逐项配置,单层「并且 / 或者」
高级advanced直接编辑条件 JSON,支持嵌套

默认条件模板为过滤未删除数据:

{
"Field": "isdeleted",
"Operator": "eq",
"Value": false
}

使用场景​

  • 分页总数计算
  • 存在性校验(数量是否为 0)
  • 看板指标统计

下一步​

属性明细​

以下内容面向技术实现与 AI 检索,说明查询数量组件的节点元数据。

节点元数据​

查询数量组件由 FlowCmpType.DbQueryCount 标识。所有节点 meta 值均以字符串存储(布尔、数字、数组等在元数据中同样以字符串形式保存)。

属性名类型含义取值/存储值
typestring组件类型固定为 "DbQueryCount"
MetaObjectIdstring(GUID)目标实体对象缺省取当前接口所属对象
DefaultFilterstring(JSON)高级模式的默认条件条件 JSON,缺省为 isdeleted = false 模板
BasicFilterstring(JSON)基础模式的默认条件条件 JSON
ConditionModestring条件编辑模式"basic"(缺省)/ "advanced"
IsFinalResultstring(bool)是否输出到最终结果"true" / "false"
IsDisabledstring(bool)是否禁用该节点"true" / "false"
orderstring同级排序例:"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" 时跳过本组件。

查询条件组装​

条件组装优先级自高到低:

  1. context.FilterOverride(最高优先):一旦赋值,覆盖其他所有条件。
  2. 否则以空条件为基底,依次 AND 拼接:
    • 默认条件:由 ConditionFilterResolver.ResolveAsync(ConditionMode, DefaultFilter, BasicFilter, ctx) 解析。ConditionMode="basic" 时读取 BasicFilter 并按值类型解析;其他情况按「高级模式」反序列化 DefaultFilter。
    • request.Condition:请求体传入的条件(与查询集合不同,数量组件在默认条件之后拼接请求条件)。
    • context.AndFilter:链路按需插入的额外 AND 条件。

与查询集合不同,数量组件不执行 {Env.*} / {Model.*} 默认值占位符替换。

权限过滤​

  1. 查询操作权限:除非 SkipOperationPermission 生效,否则调用 VerifyPermissionAsync(Query) 校验 MetaObjectDataOperationType.Query,无权限直接抛出 NoPermissionAccess。
  2. 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.CmpResultlong 计数结果
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