
后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载User Tasks013-user-tasks是 Elsa Workflow Engine 中面向人机协作的模块工作流在人类决策处挂起通过安全的任务队列暴露工作项并以类型化结果恢复执行。本文以>ParticipantReference ├── TenantId required, storage scope ├── Provider required namespace/issuer ├── Type user | group ├── Id required external identifier └── DisplayName optional non-authoritative snapshot默认的 claims 适配器DefaultClaimsIdentityResolverServices/DefaultClaimsIdentityResolver.cs把已认证主体映射为 user 引用和 group 引用宿主可以替换该适配器也可使用任意外部目录或授权策略。Elsa.Identity 不是必需依赖User Tasks 没有任何表与 Elsa.Identity 表建立外键。单元测试ClaimsResolver_PreservesExternalGroupClaimValuestest/unit/Elsa.UserTasks.UnitTests/UserTaskTests.cs验证了带分隔符的外部组声明值如group,with;delimiters会被原样保留。Live 成员关系Live 任务持久化组引用在列表/操作时评估调用者当前的带命名空间 claims。目录查找可用于丰富名称或报告健康但目录不可用不会使精确的权威 claim 匹配失效——这与 spec 中authorization must work with claims alone的决策一致。Snapshot 成员关系激活时参与者目录枚举每个配置的组并把生成的用户引用与原始组引用一并持久化。之后组织结构变化不影响资格。若枚举不可用或失败任务仍然持久化但变为manager-only并产生一个阻塞性健康问题。源码中对应的 health code 有snapshot-resolution-failed与snapshot-directory-missingDefaultUserTaskManager.cs。排除Exclusions排除项按规范化引用在认领、分配和访客验证时检查。被排除的参与者不能认领或接收任务除非活动允许经理覆盖且经理提供写入审计事件的理由。源码中AssignAsync会先检查ExcludedUsers.Any(x x.Matches(request.Assignee))若被排除且不允许覆盖或缺少理由则返回excluded-assignee冲突。Actions 与 FormsActions每个 action 具有Key字面量、不可变的工作流结果键Label物化的显示值其来源可支持表达式可选的安全展示元数据。Action key 在任务内唯一。Timeout与Cancelled是保留键设计器不能配置。这一点由UserTaskDefinitionSnapshot.Normalize()强制见 UserTaskModels.cs同时活动 UserTask.cs 中的ActionDefinitions输入将DefaultSyntax与SupportedSyntaxes限定为Literal防止表达式改变已激活任务的契约。没有启用表单的任务只接受所选配置 action不接受任意完成 JSON——CompleteAsync中RequestedForm null Data ! null会返回form-required失败。Forms表单引用包含ProviderName、Key以及请求的绑定/版本信息。激活时解析并钉住具体的 provider 版本开放中的任务绝不跟随之后的latest表单版本。安装的 provider 针对钉住的版本和所选 action 校验并归一化提交数据。若解析或钉住失败任务保持持久化但变为 manager-only 并带阻塞性健康问题health code 包括form-provider-missing、form-resolution-failed。RepairRetryResolutionAsync重试原始引用经理不能临时替换活跃任务上的表单引用。表单 provider 契约定义于 UserTaskContracts.cs 的IUserTaskFormProviderResolveAsyncValidateAndNormalizeAsync。生命周期状态机状态含义工作可见性Unassigned无直接 assignee、候选者或邀请可用Manager-only绝不成为开放的everyone队列Available至少一个候选者或邀请可认领合格候选者可见安全摘要Assigned一个参与者负责Assignee 可见受保护内容经理在租户范围内可见Completing有效的完成操作赢得竞争bookmark 恢复挂起中不再接受第二个终结 actionTimingOut超时操作赢得竞争保留Timeout恢复挂起中不接受任何工作操作Cancelling经理取消操作赢得竞争保留Cancelled恢复挂起中不接受任何工作操作Completedbookmark 恢复以配置 action 提交终结TimedOutbookmark 恢复以保留Timeout提交终结Cancelled任务被其工作流/活动取消或经启用的经理操作取消终结这九个状态与枚举UserTaskStatusUserTaskModels.cs完全一致IsTerminal帮助方法仅把后三者视为终结。转换规则触发转换与规则带直接 assignee 的活动激活创建Assigned带候选者/邀请的活动激活创建Available无任何分配的激活创建Unassigned并产生警告/健康问题合格认领原子Available → Assigned仅一个赢家释放releaseAssigned → Available或当无合格候选者/邀请时 →Unassigned受保护访问立即终止经理分配/再分配任意开放任务 →Assigned经理完成仍需先分配给责任人认证完成Assigned → Completing入队专用 User Task bookmark 恢复启用超时的到期处理开放状态 →TimingOut经保留Timeout恢复终结为TimedOut未启用超时的到期处理保持开放、置IsOverdue、发布一条幂等逾期通知启用的经理取消开放状态 →Cancelling经保留Cancelled恢复终结为Cancelled。必须提供理由工作流/活动 bookmark 移除存在匹配的挂起完成时终结为Completed否则终结为Cancelled。绝不独立恢复工作流完成、超时和取消共用一条乐观转换路径第一个提交的转换获胜后续请求收到冲突。访客验证是特殊的认领操作第一个有效邀请原子认领任务并撤销兄弟邀请访客不能释放任务。源码佐证DefaultUserTaskManager中ClaimAsync仅接受Available/UnassignedReleaseAsync清空 assignee 并按剩余候选者决定回到Available或UnassignedTimeoutAsync明确注释reserved outcomes are system transitions and must not be callable as worker-selected actions。bookmark 移除的终结逻辑在DefaultUserTaskProjectionService.FinalizeBookmarkRemovalAsyncServices/DefaultUserTaskProjectionService.cs中Completing → Completed、TimingOut → TimedOut、Cancelling → Cancelled、其余开放状态 →Cancelled并且任务终结时会调用guestSessions.RevokeForTaskAsync立即吊销所有访客会话。激活后可变性只有Priority 和 DueAt可通过受治理的运行时更新路径修改。分配变更使用专门的 claim/release/assign 操作。Title、Summary、Instructions、受保护任务数据、Actions、Exclusions、成员模式、钉住的表单在活跃任务上不可变。对应UpdateSchedulingAsync只处理Priority与DueAt的更新请求UserTaskSchedulingUpdate。Operations 与幂等性一个 operation 以(TenantId, TaskId, OperationId)为作用域存储规范化请求哈希、期望修订号、操作种类、状态与时间戳见UserTaskOperationrecord。每个需要竞态安全结果的变更都提供ExpectedRevision重复的 operation ID 与请求哈希匹配时返回既有结果/状态不重复执行命令复用 operation ID 但内容不同 →冲突409完成操作只把规范化完成数据存储在受保护的任务/操作存储中绝不放进事件或通知载荷陈旧的Completing/TimingOut/Cancelling操作由 reconciliation 按其持久化状态重试或完成绝不静默丢弃。请求哈希由SHA256(kind : JsonSerializer.Serialize(value))计算DefaultUserTaskManager.Hash。在CompleteAsync中哈希的是 provider 归一化后的规范数据因此网络重试比较的是同一请求而非归一化前的原始形状。单元测试Repository_CursorCoversSupportedSortsAndDirections与Repository_CursorIsStableAndTotalCountIgnoresCursorUserTaskTests.cs印证了列表查询在多种排序下的游标稳定性。事件与健康UserTaskEvent是追加式append-only、租户作用域、按任务修订排序的审计流。事件包含事件种类、已知时的参与者 actor 引用、时间戳、operation ID、安全理由与安全元数据绝不包含受保护的 instructions、任务数据、表单数据、完成数据、邀请密钥或 provider 私有载荷。UserTaskEventSummary作为安全审计投影不披露 actor 标识符与含输入的 reason。至少记录以下事件Created、Claimed、Released、Assigned、Reassigned、CompletionRequested、Completed、TimedOut、Cancelled、OverdueNotified、InvitationIssued、InvitationVerified、InvitationRevoked以及失败的受特权操作。源码中UserTaskEvent的EventType字段对应这些种类DefaultUserTaskManager的各变更路径都会追加对应事件。健康问题与生命周期状态分离它们标识阻塞性或建议性问题如表单解析失败、快照枚举失败、未知参与者显示数据、邀请投递失败。健康数据对经理与诊断安全不能泄露令牌或受保护载荷。对应UserTaskHealthSeverityAdvisory/Blocking、HealthCode、HealthMessage字段与UserTaskHealthChanged通知。可见性与保留不变量候选者只收到安全摘要受保护内容只披露给 assignee 或经理释放任务立即撤销受保护访问已完成任务受保护数据对完成者与经理可见前 assignee 只保留摘要与安全审计可见性Requester 仅凭 requester 身份不获得任何访问不可访问的任务 ID 与不存在的 ID 无法区分API 边界返回404所有读写都是租户作用域且必须同时通过模块权限与任务关系/策略检查终结任务默认无限期保留可选的 purge 只删除终结任务及其事件。开放任务及其操作记录永不 purge过期邀请、已吊销访客会话与已投递的邀请 outbox 条目可使用独立的短保留设置但清理不得影响任务聚合或审计历史。这些不变量在 UserTaskContracts.cs 的IUserTaskAccessPolicy与IUserTaskRepository中有完整的实现契约CreateScopeAsync返回null即拒绝null is a denial, never a no-filterSaveAsync以乐观并发修订冲突抛UserTaskRevisionConflictExceptionAppendEventAsync不消耗聚合修订号以免把读取变成伪冲突。REST 端点层Endpoints/UserTasksEndpoints.cs将领域冲突码统一映射为 HTTP 语义终结命令先返回202 Accepted工作流在带外恢复409表示竞态或分歧的 operation 复用422表示领域校验失败。实战速览从活动到 REST 的完整闭环UserTask活动Activities/UserTask.cs是工作流侧的入口它声明所有输入Title、Summary、Reference、Tags、TaskType、Requester、Assignee、CandidateUsers/CandidateGroups、ExcludedUsers、MembershipResolutionMode、AllowManagerExclusionOverride、Priority、DueAt、Instructions、TaskData、Form、ActionDefinitions、Invitations、EnableTimeoutOutcome、EnableCancellationOutcome在ExecuteAsync中创建 bookmark把UserTaskMaterialization作为 stimulus并把生成的TaskId输出ResumeAsync从工作流输入读取UserTaskStimulus把UserTaskResult(ActionKey, Data, CompletedBy, CompletedAt)写入活动结果并完成活动。权限侧模块声明两个资源Permissions/UserTasksResourcePermissions.csuser-tasksverbsview、update、claim、complete、assign、cancel、invite、supervise与user-tasks/participantsview。supervise是独立的高阶动词不隐含其他任何动词。一次完整闭环详见 quickstart.md宿主启用模块services.AddElsa(elsa elsa.UseUserTasks());默认使用内存仓库生产环境选择 SQLite / SQL Server / PostgreSQL / MySQL / Oracle 的 EF Core 持久化包沿用Elsa.Secrets的拆分模式执行工作流后以 worker token 查询GET /user-tasks?scopeavailabletaskTypeinvoice-approvallimit20includeTotalCounttrue得到仅含安全字段的摘要行dataAccess: summary、allowedActions: [claim]POST /user-tasks/{id}/claim携带{expectedRevision: 1}原子认领认领后GET /user-tasks/{id}返回钉住的表单引用、Instructions、TaskData 与审计时间线POST /user-tasks/{id}/complete携带expectedRevision、operationId、actionKey与表单数据返回202轮询直至Completed重复同一operationId幂等换内容则409经理可POST /user-tasks/{id}/assign含 reason、POST /user-tasks/{id}/release、查询scopeall与GET /user-tasks/{id}/events。持久化与测试验证模块的持久化契约IUserTaskRepository覆盖按租户/任务 ID 获取、游标分页查询、按MaterializationKey与BookmarkId查找、按邀请令牌哈希查找匿名调用方只出示密钥绝不信任调用方自报的租户/任务 ID、乐观并发保存与追加审计事件。测试侧test/unit/Elsa.UserTasks.Persistence.ConformanceTests 提供仓库一致性、故障注入、访客会话与邀请 outbox 的一致性测试基类test/unit/Elsa.UserTasks.UnitTests/UserTaskTests.cs 验证 claims 解析、游标稳定性、全排序方向覆盖等关键行为test/unit/Elsa.UserTasks.Persistence.EFCore.UnitTests 验证 EF Core 仓库实现与内存实现对等。至此从领域词汇、聚合边界、九态生命周期、幂等操作、追加式审计到安全披露规则User Tasks 的完整数据模型已经与源码一一对应。无论是嵌入宿主现有身份系统、构建候选队列还是通过访客邀请打通外部审批场景这套模型都提供了明确、可验证的实现边界。赞分享后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载相关推荐猫抓 Cat-Catch一键安装 3 种方式网页视频下载 M3U8 合并保姆级教程猫抓 Cat Catch一键安装 3 种方式网页视频下载 M3U8 合并保姆级教程 猫抓cat catch是一款免费的浏览器视频嗅探工具专门做网页后端工作流自动化流程编排低代码Elsa User Tasks构建身份无关的持久化人工任务收件箱Elsa User Tasks构建身份无关的持久化人工任务收件箱 导读 本文深入解析 ElsaThe Workflow Engine for .NET的后端工作流自动化流程编排低代码Elsa Core User Tasks身份中立的人工任务模块交付全景与源码级验证指南Elsa Core User Tasks身份中立的人工任务模块交付全景与源码级验证指南 Elsa Core 的 User Tasks用户任务特性为 .NE后端工作流自动化流程编排低代码上一篇使用 fq 的 pg_heap 解码器深入分析 PostgreSQL 堆表文件页面、页头与元组下一篇Agenda 6.x 完整指南可插拔存储后端的 Node.js 轻量级任务调度框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考