Skip to content

Lifecycle、版本与关系行为

Life Cycle Map 描述一个业务 Item 可以处于哪些状态,以及哪些身份可以把它从一个状态 Promote 到另一个状态。 它管理的是对象状态,不是人员任务;需要审批、会签或待办时,再与 Workflow 配合。

Lifecycle 还可以在状态变化时切换 Permission、启动 Workflow、发送邮件, 并为版本化对象控制 Released 语义和关系指向行为。

适用版本与资料基线

  • State、Transition、Promote、State Permission、Released 与 Item Behavior 的概念跨版本相对稳定。
  • 配置步骤以 Aras Innovator R31 官方 Life Cycles 文档和 2024 年 12 月版培训资料为界面基线。
  • R35 使用 .NET 8.0.1、R39 使用 .NET 10;运行时变化不改变本文的建模心智模型,但 Method 与界面必须在目标 Release 验证。
  • Product Engineering 等应用可能在基础 Lifecycle 之上增加变更流程约束,不能把平台基础行为直接套用到所有应用对象。

最小心智模型

读取这张图时分别问四个问题:

  1. 当前 Item 在哪个 State;
  2. 从该 State 存在哪些 Transition;
  3. 当前用户是否属于 Transition 的 Role;
  4. 到达目标 State 后,Permission、Workflow 和版本行为如何变化。

Transition Role 只回答“谁能走这条边”。 它不自动授予 Update,也不等于 Workflow Assignment。

核心机制

State

一个 Item 在任意时刻只处于 Life Cycle Map 的一个 State。 新 Item 从 Start State 开始。

R31 基线中的重要 State 属性包括:

属性作用注意
Name / Label内部名称与显示标签稳定内部名有利于维护;Label 可本地化
Image状态图标只影响呈现
Released标识版本化对象的发布状态不是简单的“只读”开关
Not Lockable当前状态不可锁定编辑与 Permission、Released 分别控制不同机制
State Permission进入状态时应用指定 Permission空值表示不改变当前 Permission
Workflow状态激活时启动允许的 Workflow MapWorkflow 必须也与同一 ItemType 关联
History Template指定历史记录模板需配合审计要求设计
Configure E-Mail进入状态时通知邮件成功不应作为状态成功的唯一证明
Item Behavior控制与版本化相关 Item 的 Fixed/Float 行为与 RelationshipType Behavior 共同决定

Transition

Transition 是有方向的状态连接。 R31 基线可配置:

  • Role:允许执行转换的 Identity;
  • Get Comment:Promote 时要求输入备注;
  • Configure E-Mail:转换相关通知;
  • 前置与后置服务器 Method。

只有图上存在的 Transition 才是正常可达路径。 不能把状态下拉框理解成可以任意跳到所有状态。

State Permission

Promote 到配置了 State Permission 的 State 时,Item 的当前 Permission 随之改变。 如果目标 State 未配置 State Permission,R31 官方说明是“不改变 Item Permission”, 不是自动恢复 ItemType 默认 Permission。

因此以下设计有问题:

text
Draft      -> Draft Permission
In Review  -> Review Permission
Released   -> (空)

如果期望 Released 使用只读权限,应显式选择 Released Permission。 该 Permission 还必须列在 ItemType 的 Permissions 关系中。

Transition Method 与事务范围

R31 官方 Life Cycles 文档给出的语义是:

  • 前置 Method 在状态转换前执行;失败或抛错会阻止 Transition;
  • 后置 Method 可以按配置区分 in-scope 与 out-of-scope;
  • in-scope 后置 Method 失败会使状态转换回滚;
  • out-of-scope 后置 Method 失败不使已完成的转换回滚。

不要把数据库回滚扩大为外部副作用回滚

即使 Method 处于转换事务范围内,也不能据此断言已发送邮件、外部 HTTP 请求、 消息队列发布或文件系统写入会被自动撤销。 涉及外部系统时仍要设计幂等、状态记录、重试和补偿。

分类与多个 Life Cycle Map

一个 ItemType 可以通过 Life Cycles 关系关联多个 Map,并按 Class Path 匹配分类。

R31 官方 Life Cycles 文档说明:

  • 新 Item 根据初始 Classification 选择适用 Map;
  • 如果 Item 仍在 Start State,Classification 改到使用另一 Map 的允许分类,平台可切换 Map;
  • 如果 Item 已离开 Start State,这类分类变更会被拒绝,以免破坏生命周期进程。

需要允许业务用户重分类时,应把回到 Start State 的受控路径纳入设计, 并同时考虑 Permission、历史和已启动 Workflow。

Lifecycle 与 Workflow 的边界

问题LifecycleWorkflow
当前对象处于什么业务状态间接反映
谁可执行状态转换Transition Role可通过活动促进进行协调
谁收到待办并投票Activity Assignment
是否可在进入状态时启动流程State 可选择 Workflow生成运行中的 Process
是否可由流程推动状态被促进的目标Activity Promotion 可触发

同一个业务决策不要同时由用户手工 Promote 和 Workflow 自动 Promote, 除非已经明确并验证竞争、重复执行和回退规则。

版本控制心智模型

Lifecycle 和 Versioning 有联系,但不是同一个功能。

属性含义
id当前 generation 的唯一 Item ID,各代次不同
config_id同一配置族共享的 ID,用于把各代次关联起来
generation配置族内递增的代次序号
major_rev主修订标识,按 Revision 序列变化
minor_rev平台保留的次修订字段;R31 培训基线不把它作为默认版本策略
is_current是否为当前代次
is_released是否达到 Released 语义

generation 增加不等于 major revision 一定增加。 非 Versionable Item 也不应被描述为“每次保存 generation 都递增”。

Versionable 与 Discipline

版本行为由 ItemType 的 Versionable 与 Discipline 配置决定。

  • Automatic:平台在受支持的编辑/锁定流程中自动建立新 generation;
  • Manual:需要显式执行版本动作,而不是每次编辑自动建立代次。

具体在何时创建 generation 与客户端动作组合有关, 验收时应观察目标 Release 的实际 idconfig_idgenerationis_current, 不要用“每按一次 Save 都升版”作为规则。

Revision 序列

Revision Item 定义 major_rev 的取值序列,例如:

text
A B C D E F G H J K L M N P Q R S T U V W X Y Z

序列以空格分隔。 常见做法跳过易与数字混淆的 IO,但这属于组织规则,不是平台强制。

R31 培训资料明确建议不要修改系统 Default Revision。 需要不同规则时创建新的 Revision,并在测试环境验证序列耗尽、导入和升级行为。

Released 与下一次修订

Released 只对关联到 Versionable ItemType 的生命周期有版本意义。 R31 官方 Life Cycles 文档说明:标记 Released 的状态在下一次受控 Lock/Unlock/Edit 序列中会把 Item 移回 Start State,并递增 Major Rev。

这不等于“对 Released Item 每次普通保存都必然升级”。 还必须考虑:

  • ItemType 是否 Versionable;
  • Discipline;
  • Released State 是否 Not Lockable;
  • 用户走的是版本/修订动作还是其他应用层变更流程;
  • Product Engineering 等应用是否接管发布与修订。

对于应用对象,应以应用用户指南定义的 Release/Revise 条件为准。

关系的版本行为

当 source 与 related Item 都可版本化时,关系需要决定“指向某个 generation”还是“跟随最新 generation”。

Behavior含义
Fixed指向指定 related generation
Float指向 related Item 的最新 generation
Hard Fixed固定且不能被生命周期状态改写
Hard Float浮动且不能被生命周期状态改写

RelationshipType 与 State 的优先规则

旧稿把优先级简单写成“State 永远高于 RelationshipType”,这是不准确的。 R31 官方 Life Cycles 文档给出的规则是:

  • RelationshipType 为普通 Fixed/Float 时,Life Cycle State Behavior 可以覆盖;
  • RelationshipType 为 Hard Fixed/Hard Float 时,它不受 State Behavior 覆盖;
  • State 设为 Hard Fixed/Hard Float 后,该行为延续到生命周期结束,后续 State 不能再改写;
  • source Item 产生新 generation 后,旧 generation 的既有配置会保持固定。

因此要按组合测试,而不是只看某一个字段。

常见配置策略

State建议起点目的
DraftFloat开发期间跟随相关对象最新代次
In ReviewFixed评审期间稳定评审基线
ReleasedHard Fixed发布后保持受控配置

这只是常见模式,不是强制答案。 如果业务要求发布对象持续跟随外部主数据,可能需要不同设计和更严格风险评审。

操作:建立最小 Life Cycle

1. 写状态与转换矩阵

先定义:

FromTransitionToRolePermission备注/校验
DraftSubmitIn ReviewAuthorsReview Permission必填字段完整
In ReviewApproveReleasedReviewersReleased Permission记录审批意见
In ReviewRejectReworkReviewersDraft Permission必须写退回原因
ReworkResubmitIn ReviewAuthorsReview Permission重新校验

矩阵必须覆盖取消、退回、重新打开和修订路径。

2. 创建 Map 与 State

以 R31 界面为基线:

  1. 打开 Administration > Life Cycle Maps
  2. 创建 Map,填写 Name 与 Description。
  3. 在画布上添加 State,明确 Start State。
  4. 配置 Label、State Permission、Released、Not Lockable 和 Item Behavior。
  5. 需要状态触发 Workflow 时,选择已允许的 Workflow Map。

3. 创建 Transition

  1. 从来源 State 新建 Transition 并连接目标 State。
  2. 配置 Role。
  3. 需要审计备注时启用 Get Comment。
  4. 仅在配置不足时添加前置/后置 Method。
  5. 明确后置 Method 的 scope,并设计失败用例。

4. 关联 ItemType

  1. 在 ItemType 的 Life Cycles 关系中加入 Map。
  2. 如按 Classification 匹配,设置并核对 Class Path。
  3. 确认所有 State Permission 已列入 ItemType Permissions。
  4. 确认需要的 Workflow Map 已列入 ItemType Workflows。
  5. 如需版本行为,核对 Versionable、Discipline 与 Revision。

验证

状态与权限

使用普通角色测试:

  1. 新 Item 是否进入正确 Start State。
  2. 当前用户只看到允许的下一步 Transition。
  3. 非 Role 成员直接 Promote 是否被服务器拒绝。
  4. 到达 State 后 permission_id 是否符合预期。
  5. 未配置 State Permission 时是否沿用此前 Permission。
  6. Not Lockable 与 Update 权限的组合是否符合业务预期。

版本字段

在测试副本上记录每一步的:

text
id
config_id
generation
major_rev
is_current
is_released
current_state

分别执行:首次创建、普通编辑、手工版本动作、进入 Released、Released 后修订, 再比较字段变化。 只有这样才能验证目标 Release 与应用包的实际版本策略。

关系行为

至少覆盖四组顺序:

  1. source 先版本化,related 后版本化;
  2. related 先版本化,source 后版本化;
  3. RelationshipType 普通 Fixed/Float + State 覆盖;
  4. RelationshipType Hard Fixed/Hard Float + State 尝试覆盖。

同时打开旧 source generation 与新 generation,确认各自指向。

查看历史版本

R31 培训基线可通过 Item 的 Navigate > Versions 查看配置族中的历史版本, 并将不同版本 Dock 后对照。 菜单位置可能变化,但核对 config_id 与 generation 的方法不变。

版本差异

基线本文采用的事实需要在目标环境确认
R31State、Transition、状态权限、Released、关系 Behavior 和配置界面菜单标签、Method scope UI、应用层 Release/Revise
R35.NET 8.0.1 运行时自定义 Transition Method 的 API 与依赖兼容性
R39.NET 10 运行时自定义服务器代码、Release Notes 与应用包行为

风险与最佳实践

  • 状态名表达业务事实,Transition 名表达动作。
  • 每条 Transition 只授予最小 Role,并配负向测试。
  • State Permission 为空表示不改变当前 Permission,不要当成“恢复默认”。
  • Released、Not Lockable、Permission 和 Versionable 分别配置、分别验证。
  • 不要把每次 Save 都写成 generation 递增。
  • 不要把 generation 与 major revision 混为一谈。
  • 不要简单宣称 State Behavior 永远高于 RelationshipType;Hard 行为有不同规则。
  • 前置 Method 用于必要校验;外部副作用采用幂等与补偿设计。
  • Workflow 与手工 Promote 的责任要唯一、清晰并可审计。
  • 上线前用真实角色演练全部正向、退回、取消和修订路径。

相关主题

官方资料

本站内容仅供学习与参考