Skip to main content

字段赋值组件

字段赋值组件(DbUpdateField)用于对实体对象的单个字段赋值,支持固定值、内置函数与动态计算三种赋值方式。

概述​

字段赋值是最常用的数据操作之一:选定操作对象与目标字段后,选择一种赋值方式写入字段值。相比「更新数据」按多条记录更新字段,本组件聚焦于单个字段的取值逻辑。

需要一次设置多个字段时,使用 批量字段赋值;需要按记录批量更新多个字段时,使用 更新数据。

配置项​

配置项说明
操作对象要操作的实体对象,必填,赋值字段来源于该对象
赋值字段要赋值的字段,必填,可搜索选择,支持关联字段
赋值方式固定赋值 / 内置函数 / 动态计算,必填
内置函数赋值方式为「内置函数」时配置
值赋值方式为「固定赋值」时配置
计算表达式赋值方式为「动态计算」时配置
输出到最终结果开启后该组件结果作为接口返回值

赋值方式取值​

界面名称值(UpdateType)说明
固定赋值static直接设置一个固定值
内置函数method使用内置函数取值
动态计算calculate通过 Razor 表达式计算值

内置函数取值​

界面名称值(Method)说明
当前时间CurrentDateTime取当前系统时间
当前登录用户LoginUserId取当前登录用户

赋值说明​

  • 赋值字段可搜索,来源为操作对象下的字段;带 IncludeLookup 时可选中关联字段。
  • 动态计算使用 Razor 表达式(C# 语法),可引用当前数据的其他字段。
  • 切换操作对象后需要重新选择赋值字段。

使用场景​

  • 写入创建人、创建时间等审计字段
  • 依据已有字段计算并回填结果字段
  • 流程节点中修正单个字段的值

下一步​

属性明细​

以下内容面向技术实现与 AI 检索,说明字段赋值组件的节点元数据。

节点元数据​

字段赋值组件由 FlowCmpType.DbUpdateField 标识,所有赋值信息平铺在节点元数据中:

属性名类型含义取值/存储值
typestring组件类型固定为 "DbUpdateField"
MetaObjectIdstring(GUID)目标实体对象缺省取当前接口所属对象
UpdateFieldstring赋值字段编码单个字段的 Code
UpdateTypestring赋值方式"static"(缺省)/ "method" / "calculate"
Methodstring内置函数"CurrentDateTime" / "LoginUserId",仅 method 有效
NewValuestring值 / 计算表达式static 时为固定值,calculate 时为 Razor 表达式
IsFinalResultstring(bool)是否输出到最终结果"true" / "false"
orderstring同级排序例:"4"

元数据存储示例​

固定赋值:

{
"ID": "assign1",
"type": "DbUpdateField",
"MetaObjectId": "3f9c0b2e-2d3a-4e6f-9c11-0f7a5b8d2e10",
"UpdateField": "Status",
"UpdateType": "static",
"NewValue": "Approved"
}

动态计算:

{
"type": "DbUpdateField",
"UpdateField": "TotalAmount",
"UpdateType": "calculate",
"NewValue": "@(Quantity * Price)"
}

服务端执行逻辑​

本组件在服务端的实现类为 DbUpdateFieldComponentManager,组件类型为 FlowComponentTypeEnum.DbUpdateField。该管理器已标记 [Obsolete](旧的单字段入口已不再维护,仅为历史兼容保留),新组件请使用 批量字段赋值(DbBatchUpdateField)。

执行时机与场景​

  • 流程引擎分两个阶段调用组件:保存/发布时进入校验阶段(_VerifyAsync),运行期进入执行阶段(_ExecuteAsync)。
  • 组件基类为 InterfaceComponentManagerBase(不是 TriggerComponentManagerBase),因此不做对象触发器节点级执行追踪。节点 IsDisabled 为 "true" 时整体跳过;每次进入递增 RecursionDeep,超过 100 抛 ProcessCycleOrNodeMoreThanLimit。

输入数据来源​

节点配置全部取自 context.CurrentNode.Meta,所有 meta 值均以字符串形式存储。本组件读取的 key 为 MetaObjectId、UpdateField、UpdateType、Method、NewValue、IsFinalResult;type、IsDisabled 由基类读取。

待赋值数据按以下优先级解析:

  1. 上游结果优先:context.CmpResult 为 List<ObjectData> 时直接就地赋值;
  2. 否则处理请求数据:context.Request?.List。

执行步骤​

  1. 校验(_VerifyAsync):MetaObjectId 为空抛 OperationObjectNotFound;查询 MetaObject 不存在抛 MetaObjectNotFoundById;UpdateField 为空抛 UpdateFieldNotSet;UpdateType 为空抛 AssignmentModeNotSelected;UpdateType == "method" 且 Method 为空抛 AssignmentFunctionNotSelected。
  2. 模型解析:GetMetaObjectByIdFromCacheAsync 读取对象定义;GetMetaFieldsIncludeLookupByMetaObjectIdFromCacheAsync 读取含 lookup 的字段列表。
  3. 字段校验:UpdateField 不在字段编码内抛 UpdateFieldNotInEntity。
  4. 赋值:按优先级取列表,调用 metaFieldService.ApplyFieldAssignment(...) 就地修改字段值。CmpResult 分支传入 context.SystemParam,请求分支不传。
  5. 回写上下文后进入下游。

赋值语义与 SQL 形态​

ApplyFieldAssignment 按 UpdateType 分三种处理(仅在内存中修改 List<ObjectData>):

UpdateType行为
static直接 item[field] = 值;值若为 @LoginUserId / @CurrentDateTime 则先解析为当前用户 / DateTime.UtcNow
methodCurrentDateTime → DateTimeOffset.UtcNow;LoginUserId → 当前登录用户;其他值忽略
calculate用 Razor 编译 NewValue,参数合并链路变量与当前行字段(同名字段优先),异常抛 DynamicAssignmentCalculationError

重要:本组件不落库。_ExecuteAsync 只对 List<ObjectData> 做内存赋值,不调用任何 IChameleonDbContext 写方法。要让结果持久化,需在下游接 更新数据 或 批量字段赋值 等写库组件。

输出与上下文​

  • context.CmpResult = result(赋值后的对象集合)。
  • context.DicParam 写入:BizDataIds(逗号拼接的 _id)、MetaObjectCode、MetaObjectId;GetMetaObjectByIdFromCacheAsync 另写入 ChameleonMetaObjectId、ChameleonMetaObjectCode。
  • IsFinalResult 为 "true" 时:设置 context.TransferResult.List/Total 与 context.Result = ResponseResult<List<ObjectData>>.Success(result).Total(result.Count)。与写入/更新组件不同,此处 data 为完整列表(未做 Take(1))。

事务、批量阈值与限制​

  • 本组件不读取列表条数、无批量阈值限制(因为不落库)。
  • 组件自身不涉及事务;递归深度上限 100。

权限校验​

本组件不执行任何权限校验:不依赖 permissionService,也不读取 SkipOperationPermission / SkipMouPermission。

异常与校验​

触发条件错误常量
MetaObjectId 为空OperationObjectNotFound
目标对象不存在MetaObjectNotFoundById
UpdateField 为空UpdateFieldNotSet
UpdateType 为空AssignmentModeNotSelected
UpdateType == "method" 且 Method 为空AssignmentFunctionNotSelected
赋值字段不在对象字段内UpdateFieldNotInEntity
动态计算表达式执行失败DynamicAssignmentCalculationError(附 MoreMessage)

所有异常经 ErrorException 包装,附带组件类型、接口 id、节点 id 定位信息;文案取自 locale 资源。