在以下场景中经常会出现: Maximo 实施:计划员打开车辆工单时,需要向其中添加六项维修任务。这些任务并非临时编造,而是作为记录预先存在于维修地点中,且同一批任务会被反复使用。

通常人们的第一直觉是使用作业计划。当每次都适用同一套任务时,这种方法很有效;但一旦计划员需要任意子集,它就失效了。作业计划会从十个变成四十个,再到一百个,每一个都只是前一个的细微变体。另一种选择是手动输入任务,这不仅速度慢,而且由于拼写差异,会导致描述不统一。

在本篇博客中,我们将介绍第三种方案:一个自定义对话框,它列出已归档的任务,允许计划员勾选所需项,并一键将其复制到工单中。只需一个签名选项、一个对话框和一个简短的自动化脚本,无需创建新对象,也无需 Java。

设置

背景是带有“任务”表的“工单跟踪”屏幕。以下三个部分已就绪:

  • TASKREPLOC - 一个存储维修任务目录的自定义对象,每个任务包含地点、任务 ID 和描述。如果您想使用特定条件引入所有作业任务,可以跳过此项。
  • 从 WORKORDER 到该对象的同名关系,其范围设定为仅向计划员显示与当前工单相关的任务。
  • SHOWTASKS - 从工单到其任务的内置关系。这是复制后的行所存放的位置。

核心思路: 对话框本身不保存任何内容,它只是一个选择器。它的作用仅仅是容纳一组记录并记住用户勾选了哪些。通过“确定”按钮触发的签名选项将控制权交给自动化脚本,由脚本完成实际工作。

第一步:创建签名选项

签名选项是屏幕上的按钮与服务器上的脚本之间的桥梁。没有它,按钮就无法触发操作启动点。

添加/修改签名选项。针对该应用程序创建 ADDREPTASK,并设置高级签名选项,以便从用户界面调用此操作。

选项名称 ADDREPTASK 即为对话框按钮将触发的确切字符串,且区分大小写。  

请记得将 ADDREPTASK 授予所需的权限组。如果选项存在但未被授予权限,按钮虽然会显示且对话框也能打开,但点击“确定”后将没有任何反应,也不会显示错误信息。

第 2 步:添加打开对话框的按钮

在应用程序设计器中,将一个按钮添加到“任务”表格工具栏。

按钮属性。将事件设置为 selectrepairtasks,这是我们即将定义的对话框 ID。


关键技巧: 只需将事件设置为对话框 ID 即可打开该对话框。解决方案的这一部分无需任何脚本,也不需要目标 ID 或值。Maximo 会识别出与演示文稿中对话框匹配的事件名称,并针对当前记录将其打开。

第 3 步:定义对话框

将对话框添加到应用程序 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> 

从头开始阅读:

  • beanclass MultiselectDataBean 提供了勾选功能,更重要的是,它能在用户翻页浏览列表时记住已选内容。
  • parentdatasrc MAINRECORD 将对话框与当前打开的工单关联起来,从而解析出它们之间的关系。
  • relationship TASKREPLOC 提供了这些行。这也是脚本将读取的数据源。
  • selectmode multiple 和第一个 tablecol(带有 mxevent toggleselectrow)共同生成了勾选框列。
  • inputmode readonly 禁止用户在选择器内部编辑源目录。
  • savemode onunload 会在对话框关闭时提交工单数据源,这正是脚本所添加的任务行得以持久化的原因。

底部的两个按钮体现了设计决策。取消按钮使用系统自带的 dialogcancel 事件。“添加所选任务”按钮则使用 mxevent="ADDREPTASK",即步骤 1 中的签名选项。

一个常见的误区: 复制一个系统自带的多选对话框,并保留其 OK 按钮的 mxevent="dialogok" 及 value 属性。该 value 指定了应用程序 bean 上的 Java 方法,因此它会错误地调用为完全不同的表编写的代码。自动化脚本不能在此处命名,请改为触发签名选项。

步骤 4:自动化脚本

该脚本是 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 操作。  

运行效果

工单最初显示为空任务列表和一个单独的按钮。

没有任务的工单,以及工具栏上的“选择维修任务”按钮。


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

该对话框列出了 WKSHP3 位置的三项维修任务,并分别标注了任务 ID 和描述。

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

三项任务均已选中,准备添加。

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

三项任务创建完成。


整个交互过程仅需四次点击。

扩展模式

该解决方案并不局限于维修任务。若要将其应用于其他来源或目标,只需更改以下四项内容,其余部分无需变动:

  1. 对话框中的关联关系,用于决定用户从何处进行选择。
  1. 对话框表格中的列。
  1. 脚本所添加的关联关系。
  1. 用于映射两者关系的 setValue 代码块。

签名选项、按钮连接以及 getSelection 逻辑均无需更改。

首先要明确一点: 请务必正确界定数据源关系。如果选择器返回目录中的每一行数据,在处理真实数据时将无法使用。请在关系子句(where clause)中通过相关属性进行过滤,而不是在脚本中过滤,这样对话框就只会获取其需要显示的内容。

总结

自定义对话框通常被认为很难处理,而难点几乎总是相同的:如何让屏幕上的按钮触发通常由 Java 代码处理的服务器端代码。一旦你掌握了按钮事件可以指定打开某个对话框,并且可以通过签名选项运行脚本,剩下的工作就只是编写一小段自动化脚本了。

MORE Community Logo
Live from the MORE community

Your Maximo questions probably already have answers

See what Maximo users are asking, answering, and solving right now.

Unlock the Ultimate Guide to IBM Maximo Application Suite (MAS)

Discover everything you need to know to modernize your asset management strategy.

Inside, you’ll learn:

  • What’s new in IBM Maximo Application Suite 9.0
  • Key differences between Maximo 7.6 and MAS
  • How AppPoints and OpenShift change the game
  • Industry use cases across energy, manufacturing, and transportation
  • Step-by-step guidance for upgrading and migration readiness
Cover of 'The Ultimate Guide to MAS Maximo Application Suite' by Naviam featuring a man in a yellow construction helmet and safety vest holding a tablet.
×

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.

Read Press Release