Maximo工作流中如何判断流程期间记录是否被修改及解决isModified()失效问题
解决Maximo工作流中判断记录是否修改的问题
这个自动保存触发后isModified()重置的坑确实头疼,我之前帮客户处理过类似的场景,给你几个实用的解决方案:
方案1:提前保存原始数据快照到工作流变量
这是最直接有效的方法,绕开isModified()的限制:
- 在工作流的**启动节点(Start Node)**添加初始化动作,把需要检测的字段值复制到工作流变量中。比如你要监控
DESCRIPTION和STATUS字段,就创建两个工作流变量ORIG_DESCRIPTION、ORIG_STATUS。 - 初始化动作可以用Maximo自带的
Set Variable动作,选择对应的字段赋值给变量;如果字段多或者需要复杂逻辑,也可以写一个简单的自定义Java类,在启动时遍历目标字段,把原始值存入工作流上下文的变量里。 - 在条件节点中,直接对比当前记录的字段值和这些原始变量的值。比如判断
${WORKORDER.DESCRIPTION} != ${ORIG_DESCRIPTION}或者${WORKORDER.STATUS} != ${ORIG_STATUS},只要有一个字段不等,就说明记录被修改过。 - 这个方法的好处是不受自动保存影响,因为原始值已经存在工作流变量里,保存后当前字段值会更新,但原始变量的值不会变。
方案2:禁用工作流路由时的自动保存(谨慎使用)
如果你的业务场景允许,可以尝试关闭路由触发的自动保存:
- 打开对应的应用程序配置(比如Work Order Tracking),找到应用程序属性里的
Auto Save on Workflow Route选项,把它设为No。 - 或者在工作流的节点设置里,检查是否有针对该节点的自动保存配置,有些自定义节点可能自带保存逻辑,可以去掉。
- 注意:这个方法有风险,如果用户在输入节点修改后直接点击路由,没手动保存的话,修改内容会丢失。所以最好配合在输入节点添加提示,提醒用户先保存再提交。
方案3:利用Maximo审计功能追踪修改
如果需要更全面的修改记录,可以借助Maximo的审计模块:
- 开启目标对象(比如WORKORDER)的审计功能,在对象结构里配置需要审计的字段,Maximo会把修改记录存到
AUDITTRAIL表中。 - 在条件节点的自定义类里,查询
AUDITTRAIL表,过滤出当前工作流实例对应的记录,且修改时间在工作流启动时间之后的记录。如果存在这样的记录,说明数据被修改过。 - 这个方法适合需要追溯修改历史的场景,但配置和代码逻辑相对复杂一点,要注意性能,避免频繁查询审计表。
方案4:自定义类中手动缓存原始值
如果一定要用自定义类,可以自己手动缓存原始值,不依赖Mbo的isModified():
- 在工作流第一次加载记录时(比如启动节点的自定义动作),把Mbo的字段值存入一个HashMap,然后把这个HashMap放到工作流的上下文(WorkflowContext)中。
- 在条件节点的自定义类里,从上下文取出这个HashMap,对比当前Mbo的字段值和缓存的原始值。
- 注意:要确保缓存的键值对和字段对应准确,并且工作流上下文在整个流程中是持续存在的,不会被重置。
一些额外提醒
- 只监控业务上需要的字段,不要对比所有字段,不然会增加不必要的性能开销。
- 如果用工作流变量,变量名尽量规范,比如加前缀
ORIG_,避免和系统变量冲突。 - 自定义类要遵循Maximo的开发规范,确保在多用户环境下线程安全,不要用静态变量存缓存值。
内容的提问来源于stack exchange,提问作者coderzzz18
相关产品推荐
相关产品推荐

