跳到主要内容

物理删除组件

物理删除组件(DbDelete)用于从数据库中永久删除实体记录,操作不可逆。

概述​

物理删除直接移除数据库中的记录,删除后数据无法恢复。组件针对「操作对象」执行删除,删除范围由上游传入的记录决定,并支持「跳过操作权限校验」。

大多数业务场景建议优先使用逻辑删除;物理删除适用于清理测试数据、过期数据等无需追溯的场景。

配置项​

配置项说明
操作对象要删除的实体对象,必填
跳过操作权限校验开启后不校验当前用户对目标对象的操作权限
输出到最终结果开启后该组件结果作为接口返回值

执行流程​

注意事项​

危险

物理删除不可逆,请谨慎使用。需要保留数据痕迹时应使用逻辑删除。

使用场景​

  • 清理测试数据
  • 删除过期、无保留价值的数据
  • 数据归档后的清理

下一步​

属性明细​

以下内容面向技术实现与 AI 检索,说明物理删除组件的节点元数据。

节点元数据​

物理删除组件由 FlowCmpType.DbDelete 标识:

属性名类型含义取值/存储值
typestring组件类型固定为 "DbDelete"
MetaObjectIdstring(GUID)目标实体对象缺省取当前接口所属对象
SkipOperationPermissionstring(bool)是否跳过操作权限校验"true" / "false"
IsFinalResultstring(bool)是否输出到最终结果"true" / "false"
orderstring同级排序例:"6"

元数据存储示例​

{
"ID": "del1",
"type": "DbDelete",
"MetaObjectId": "3f9c0b2e-2d3a-4e6f-9c11-0f7a5b8d2e10",
"SkipOperationPermission": "false",
"IsFinalResult": "false",
"order": "6"
}

服务端执行逻辑​

本组件在服务端的实现类为 DbDeleteComponentManager,组件类型为 FlowComponentTypeEnum.DbDelete。本节说明服务端如何解析节点配置、做行级权限过滤并以物理删除方式落库。

执行时机与场景​

  • 流程引擎分两个阶段调用组件:保存/发布时进入校验阶段(_VerifyAsync),运行期进入执行阶段(_ExecuteAsync)。
  • 组件基类为 TriggerComponentManagerBase(继承 InterfaceComponentManagerBase)。节点 IsDisabled 为 "true" 时整体跳过;每次进入递增 RecursionDeep,超过 100 抛 ProcessCycleOrNodeMoreThanLimit。
  • 对象触发器场景下 ExecuteAsync 会额外记录节点耗时与成功/失败。

输入数据来源​

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

待删除记录按以下优先级解析:

  1. 上游结果优先:context.CmpResult 为 List<ObjectData> 时直接使用;
  2. 否则回退请求数据:context.Request 深克隆后的 Request.List。

两者都为空时执行 ExecuteNextAsync(空操作)。

执行步骤​

  1. 校验:MetaObjectId 为空抛 OperationObjectNotFound;查询 MetaObject 不存在抛 MetaObjectNotFoundById;若目标为员工信息对象(System_UserInformation_MetaObjectId)抛 UserInformationObjectNotAllowedDelete。
  2. 特殊对象拦截(执行阶段开头):员工信息 → UserInformationNotAllowedDelete;组织(System_Organization_MetaObjectId)→ OrganizationNotAllowedDelete。
  3. 取数:按优先级解析列表,为空则跳过;条数 > BatchOperationThreshold(100)抛 SingleOperationDataCannotMorethanXCount。
  4. Id 校验:任一条目 _id 非法 GUID 抛 DataIdNotGuidFormat(附该 _id)。
  5. 模型解析:GetMetaObjectByIdFromCacheAsync 读取对象定义。
  6. 权限校验:操作权限与 MOU 行级权限,见「权限校验」。MOU 过滤只保留有权限的记录(list 被收缩)。
  7. 落库:见「数据操作与 SQL 形态」。
  8. 回写上下文后进入下游。

数据操作与 SQL 形态​

按 MetaObjectId 分支删除:

条件处理
System_ChameleonFile_Id逐条 chameleonFileService.DeleteAsync(item)
其他chameleonDbContext.BatchDeleteAsync(metaObject.Code, ids.Select(Guid.Parse))

即普通对象通过 IChameleonDbContext.BatchDeleteAsync 按 _id 集合物理删除;系统文件走文件服务删除。System.UserInformation、System.Organization 被禁止物理删除。

输出与上下文​

  • context.CmpResult = list(MOU 过滤后的剩余列表)。
  • context.DicParam 写入:BizDataIds(逗号拼接的 _id)、MetaObjectCode、MetaObjectId;GetMetaObjectByIdFromCacheAsync 另写入 ChameleonMetaObjectId、ChameleonMetaObjectCode。
  • IsFinalResult 为 "true" 时:设置 context.TransferResult.List/Total 与 context.Result = ResponseResult<List<ObjectData>>.Success([.. list.Take(1)]).Total(list.Count),最终结果只返回第一条记录、total 为删除条数。

事务、批量阈值与限制​

  • 批量阈值:单次条数不得超过 CommonConst.BatchOperationThreshold = 100,超出抛 SingleOperationDataCannotMorethanXCount。
  • 物理删除不可恢复;系统对象(员工信息、组织)禁止物理删除,系统文件改走文件服务。
  • 组件自身不显式开启事务,删除由 IChameleonDbContext 执行;是否处于事务中以 IChameleonDbContext.InTransaction 为准。

权限校验​

  • 操作权限:未跳过时调用 permissionService.VerifyPermissionAsync(PermissionRequest.CreateMetaObjectDataOperation(metaObject._id, MetaObjectDataOperationType.Delete))。
  • MOU/行级权限:未跳过时以 CombineDataPermissionFilterAsync(context, metaObject, FilterBuilder.In(CommonConst._id, ids), MouPermissionStageEnum.Delete) 生成条件,再用 GetListAsync(metaObject.Code, filter, ["_id"]) 取回有权限的 _id,收缩 list;为空抛 NoPermissionOperateData。
  • 跳过标志:SkipOperationPermission 取节点 meta 或 DicParam 任一为 "true";SkipMouPermission 仅从 DicParam["SkipMouPermission"] 读取。

异常与校验​

触发条件错误常量
MetaObjectId 为空OperationObjectNotFound
目标对象不存在MetaObjectNotFoundById
员工信息对象(校验阶段)UserInformationObjectNotAllowedDelete
员工信息对象(执行阶段)UserInformationNotAllowedDelete
组织对象OrganizationNotAllowedDelete
条数超过 100SingleOperationDataCannotMorethanXCount
_id 非 GUIDDataIdNotGuidFormat
MOU 过滤后无可操作数据NoPermissionOperateData

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