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 的实际 id、config_id、generation 和 is_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

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

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 的责任要唯一、清晰并可审计。
  • 上线前用真实角色演练全部正向、退回、取消和修订路径。

相关主题 ​

官方资料 ​

本站内容仅供学习与参考