应用场景:触发自动化脚本的多选对话框


在以下场景中经常会出现: Maximo 实施:计划员打开车辆工单时,需要向其中添加六项维修任务。这些任务并非临时编造,而是作为记录预先存在于维修地点中,且同一批任务会被反复使用。
通常人们的第一直觉是使用作业计划。当每次都适用同一套任务时,这种方法很有效;但一旦计划员需要任意子集,它就失效了。作业计划会从十个变成四十个,再到一百个,每一个都只是前一个的细微变体。另一种选择是手动输入任务,这不仅速度慢,而且由于拼写差异,会导致描述不统一。
在本篇博客中,我们将介绍第三种方案:一个自定义对话框,它列出已归档的任务,允许计划员勾选所需项,并一键将其复制到工单中。只需一个签名选项、一个对话框和一个简短的自动化脚本,无需创建新对象,也无需 Java。
背景是带有“任务”表的“工单跟踪”屏幕。以下三个部分已就绪:
核心思路: 对话框本身不保存任何内容,它只是一个选择器。它的作用仅仅是容纳一组记录并记住用户勾选了哪些。通过“确定”按钮触发的签名选项将控制权交给自动化脚本,由脚本完成实际工作。
签名选项是屏幕上的按钮与服务器上的脚本之间的桥梁。没有它,按钮就无法触发操作启动点。

选项名称 ADDREPTASK 即为对话框按钮将触发的确切字符串,且区分大小写。
请记得将 ADDREPTASK 授予所需的权限组。如果选项存在但未被授予权限,按钮虽然会显示且对话框也能打开,但点击“确定”后将没有任何反应,也不会显示错误信息。
在应用程序设计器中,将一个按钮添加到“任务”表格工具栏。

关键技巧: 只需将事件设置为对话框 ID 即可打开该对话框。解决方案的这一部分无需任何脚本,也不需要目标 ID 或值。Maximo 会识别出与演示文稿中对话框匹配的事件名称,并针对当前记录将其打开。
将对话框添加到应用程序 XML 中。代码很简洁,每个属性都各司其职。
<dialog beanclass="psdi.webclient.system.beans.MultiselectDataBean"
id="selectrepairtasks" label="Select Repair Tasks"
parentdatasrc="MAINRECORD" relationship="TASKREPLOC"
savemode="onunload">
<table id="selectrepairtasks_select_table" inputmode="readonly"
label="Tasks" selectmode="multiple" width="700">
<tablebody displayrowsperpage="15" filterable="true"
id="selectrepairtasks_select_table_tablebody">
<tablecol id="selectrepairtasks_select_table_tablebody_1"
mxevent="toggleselectrow" type="event"
filterable="false" sortable="false"/>
<tablecol dataattribute="location" id="..._tablebody_2"/>
<tablecol dataattribute="taskid" id="..._tablebody_4"/>
<tablecol dataattribute="description" id="..._tablebody_3"/>
</tablebody>
</table>
<section id="selectrepairtasks_btn_section">
<sectionrow id="selectrepairtasks_btn_row">
<section datasrc="mainrecord" id="selectrepairtasks_act_section">
<buttongroup id="selectrepairtasks_act_bg">
<pushbutton id="selectrepairtasks_cancel" label="Cancel"
mxevent="dialogcancel"/>
<pushbutton id="selectrepairtasks_add" label="Add Selected Tasks"
mxevent="ADDREPTASK" default="true"/>
</buttongroup>
</section>
</sectionrow>
</section>
</dialog>
从头开始阅读:
底部的两个按钮体现了设计决策。取消按钮使用系统自带的 dialogcancel 事件。“添加所选任务”按钮则使用 mxevent="ADDREPTASK",即步骤 1 中的签名选项。
一个常见的误区: 复制一个系统自带的多选对话框,并保留其 OK 按钮的 mxevent="dialogok" 及 value 属性。该 value 指定了应用程序 bean 上的 Java 方法,因此它会错误地调用为完全不同的表编写的代码。自动化脚本不能在此处命名,请改为触发签名选项。
该脚本是 WORKORDER 上的一个操作启动点,绑定到 ADDREPTASK 签名选项。
# Script : ADDREPTASK
# Trigger : Action launch point — WORKORDER, signature option ADDREPTASK
# Purpose : Copy the repair tasks ticked in the dialog onto the work order.
from psdi.mbo import MboConstants
# mbo here is MAINRECORD, the work order, because the button sits in a
# section with datasrc="mainrecord"
target_set = mbo.getMboSet("SHOWTASKS")
# read the ticked rows straight out of the dialog's data bean
session = service.webclientsession()
databean = session.getDataBean("selectrepairtasks") # the dialog id
mboSet = databean.getMboSet()
selection = mboSet.getSelection()
for task in selection:
location = task.getString("LOCATION")
description = task.getString("DESCRIPTION")
new_task = target_set.add()
new_task.setValue("repairfacility", location, MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
new_task.setValue("description", description, MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
new_task.setValue("assetnum", None, MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
new_task.setValue("parentchgsstatus", False, MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
new_task.setValue("woacceptscharges", False, MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
service.closeDialog()
值得研究的部分: 获取选择内容的那三行代码。脚本通过对话框 ID 向 Web 客户端会话请求对话框背后的数据 bean,然后向该 bean 请求其 MboSet 并调用 getSelection()。这只会返回用户勾选的行。遍历数据 bean,选择内容便直接呈现。
其余部分均为常规的 Maximo 操作。
工单最初显示为空任务列表和一个单独的按钮。

点击该按钮将打开对话框,显示该工单可用的任务。

计划员勾选所需任务。点击标题复选框可一次性选中全部三项任务。

只需点击“添加所选任务”,对话框随即关闭,任务列表便已填充完毕。

整个交互过程仅需四次点击。
该解决方案并不局限于维修任务。若要将其应用于其他来源或目标,只需更改以下四项内容,其余部分无需变动:
签名选项、按钮连接以及 getSelection 逻辑均无需更改。
首先要明确一点: 请务必正确界定数据源关系。如果选择器返回目录中的每一行数据,在处理真实数据时将无法使用。请在关系子句(where clause)中通过相关属性进行过滤,而不是在脚本中过滤,这样对话框就只会获取其需要显示的内容。
自定义对话框通常被认为很难处理,而难点几乎总是相同的:如何让屏幕上的按钮触发通常由 Java 代码处理的服务器端代码。一旦你掌握了按钮事件可以指定打开某个对话框,并且可以通过签名选项运行脚本,剩下的工作就只是编写一小段自动化脚本了。
Discover everything you need to know to modernize your asset management strategy.
Inside, you’ll learn:

ActiveG, BPD Zenith, EAM Swiss, InterPro Solutions, Lexco, Peacock Engineering, Projetech, Sharptree, and ZNAPZ have united under one brand: Naviam.
You’ll be redirected to the most relevant page at Naviam.io in a few seconds — or you can
go now.