在 WORK ORDER 中填充自定义 X 和 Y 字段

Populate custom X & Y fields in WORKORDER

更新:

在 Maximo 7.6.1.1 中,我在这些表中有自定义字段:


我想使用以下逻辑填充 WORKORDER 中的 XY 字段。

(逻辑与 auto-create spatial search 中的逻辑相似但略有不同。)

At a high level:

  • If exists, use WOSERVICEADDRESS.LATITUDEY & LONGITUDEX
  • Else, use ASSET.X & Y
  • Else, use LOCATIONS.X & Y

提议的伪代码:

Scenario: A user is creating a new work order or editing an existing work order.

When the WO is saved:

01    1.  In the related WOSERVICEADDRESS table:
02
03        if WOSERVICEADDRESS.LATITUDEY gets edited:
04
05            if WOSERVICEADDRESS.LATITUDEY is not null:
06                then update WORKORDER.X & Y with WOSERVICEADDRESS.LATITUDEY & LONGITUDEX
07
08           #Handle the scenario where the WOSERVICEADDRESS.LATITUDEY is changed to null:
09
10            elseif WORKORDER.ASSETNUM is not null:
11                then update WORKORDER.X & Y with the related values in ASSET.X & Y
12
13            elseif WORKORDER.LOCATION is not null:
14                then update WORKORDER.X & Y with the related values in LOCATIONS.X & Y
15    
16    2.  In the WORKORDER table: 
17
18        (if WORKORDER.ASSETNUM gets edited or if WORKORDER.LOCATION gets edited) and if WOSERVICEADDRESS.LATITUDEY is null
19
20        then:
21            if WORKORDER.ASSETNUM is not null:
22            then update WORKORDER.X & Y with the related values in ASSET.X & Y
23
24            elseif WORKORDER.LOCATION is not null:
25            then update WORKORDER.X & Y with the related values in LOCATIONS.X & Y.

有没有办法执行此 Jython 自动化脚本(不会减慢工单应用程序的速度)?

(关键字:Maximo Spatial)

对于#2 和#3,你可以使用这样的东西: - 在工单对象上创建自动脚本 - 保存事件 - 创建两个变量:assetnum 和 location 并将它们绑定到 assetnum 和 location 字段 - 使用 "var_modified" 标志来确定变量是否更新:

x = ""
y = ""

if assetnum_modified or location_modified:
  if location:
    x = mbo.getString("ASSET.LONGITUDEX")
    y = mbo.getString("ASSET.LATITUDEY")
  elif assetnum:
    x = mbo.getString("ASSET.LONGITUDEX")
    y = mbo.getString("ASSET.LATITUDEY")

woaddr = mbo.getMboSet("SERVICEADDRESS").getMbo(0)
if woaddr.getString("LONGITUDEX"):
  x = woaddr.getString("LONGITUDEX")
  y = woaddr.getString("LATITUDEY")

mbo.setValue("LONGITUDEX", x)
mbo.setValue("LATITUDEY", y)

对于 WO 服务地址,它有点棘手,因为它是不同的 table。如果性能是您系统的一个大问题,解决方案可能是在 WOSERVICEADDRESS 对象上创建一个单独的脚本,并根据您的规则

处理 "Add/Update" 和 "Delete" 事件的逻辑

根据您希望解决方案更明确地从另一个问题的答案、此处的另一个答案、此处另一个答案的评论以及更新的要求拼凑而成的想法,我创建了一个合并所有这些。我根本没有对此进行测试,某些关系、事件条件或通过 API 的确切跃点可能不正确。这还假设如果 X 或 Y 在一个优先的位置填充但另一个不是,您仍然希望使用该位置的填充值和空白值。

因为它们在两个不同的对象上,所以处理服务地址更新的效率会稍低,因为这需要自己处理。 首先,在 SERVICEADDRESS 对象上创建一个自动化脚本启动点。在 "add" 和 "update" 上将其设置为 运行 并执行那些 "before save"。添加:longitudex != :$old_longitudex or :latitudey != :$old_latitudey的对象事件条件。使该脚本如下:

# Assume this change is being made from the UI, so the work order will be the owner of the
# SERVICEADDRESS object. This way your modifications can be reflected on screen and not cause a
# refetch error if the user also modified work order in this same transaction.
wo = mbo.getOwner()
if wo is not None:
    wo.setValue("X", mbo.getString("LONGITUDEX"))
    wo.setValue("Y", mbo.getString("LATITUDEY"))

如果服务地址字段发生变化,这会负责更新工单的字段。他们将始终覆盖工作订单上的内容,以便按照您的要求采取先例。如果有人清除这些值然后保存,这也会尝试清除工作订单上的值,如果实际上有资产或位置 x 和 y,则可能不需要这样做。如果不删除下一个脚本的事件条件,您将无法真正处理它,如果您想像您说的那样经常避免 运行ning,您真的不想这样做。

其次,在 WORKORDER 对象上创建一个自动化脚本启动点。在 "add" 和 "update" 上将其设置为 运行 并执行那些 "before save"。添加:asset != :$old_asset or :location != :$old_location的对象事件条件。使该脚本如下:

saddr = mbo.getMboSet("SERVICEADDRESS").getMbo(0)
if saddr is None or (saddr.getString("LONGITUDEX") == "" and saddr.getString("LATITUDEY") == ""):
    asset = mbo.getMboSet("ASSET")
    location = mbo.getMboSet("LOCATION")
    if asset is not None and (asset.getString("X") != "" or asset.getString("Y") != ""):
        mbo.setValue("X", asset.getString("X"))
        mbo.setValue("Y", asset.getString("Y"))
    else if location is not None and (location.getString("X") != "" or location.getString("Y") != ""):
        mbo.setValue("X", location.getString("X"))
        mbo.setValue("Y", location.getString("Y"))

只要服务地址上没有 x 或 y,此脚本负责在资产或位置中的任何一个被修改时更新工作单。如果事实证明资产或位置上都没有 x 或 y,它将跳过设置工作订单的值,从而保留任何已经存在的值(虽然应该什么都没有,因为服务地址不会有值要么,如果它走到这一步)。

自动化脚本的替代方法是使用属性 formulas:

NVL(SERVICEADDRESS$LatitudeY,NVL(ASSET$Y,NVL(LOCATION$Y,"")))
NVL(SERVICEADDRESS$LongitudeX,NVL(ASSET$X,NVL(LOCATION$X,"")))

我猜测是每次保存WO时的公式运行,也就是说这个选项不符合题中的要求。

但公式非常简单,可能不会影响性能,因此它们可能是一个可行的选择。

此处提供有关 Maximo 公式的更多信息:Formulas 1 (PDF) and Formulas 2 (PDF)


注意:我无法弄清楚 how to return null(如果所有搜索字段均为空)。