ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Maximo定制开发全链路:对象、应用、程序三层与实用自查清单

Maximo定制开发全链路:对象、应用、程序三层与实用自查清单

简介:Maximo作为企业级资产管理软件,其数据库配置与属性设计是系统落地的基础,也是许多新手最先遇到的难点。这份培训文档面向刚接触Maximo的运维人员、资产管理员及系统实施者,围绕第一章“数据库配置”与第二章“属性配置”系统展开:从连接数据库、新建对象、理解主对象、持久性、级别与类,到设置属性类型、等同属性、搜索类型、虚拟字段、缺省值与自动编号,并配有test、testline等练习表及关系示例,能够帮助读者建立完整的数据模型认知,掌握工单、资产等核心模块的配置思路。资源为单个doc文件,大小约5.96MB,目录结构清晰,适合按章节逐节阅读和对照上机练习。目前已有253人学习浏览,文档末尾还提供了作者在CSDN发布的延伸阅读链接,便于读者进一步获取Maximo实际使用技巧、排错经验与最佳实践,避免常见配置误区。

1. Maximo 定制开发地图:先分清对象、应用与程序三层

Maximo 的定制开发之所以容易让人一头雾水,是因为它的所有功能都可以被拆成三条线:数据库配置负责“数据长什么样”,应用程序设计器负责“界面怎么摆”,扩展程序负责“操作逻辑怎么跑”。只要心里有这张三层地图,后面学对象、属性、域、权限、后台任务都只是往里填细节。这份笔记按培训教材的模块顺序重新整理成一条可复习的链路,适合正在跟项目做二次开发、或者准备内部考核的人使用——把每个模块的“是什么、改哪里、什么时候生效”一次理清,复习时直接拿最后一张清单自查。

2. 数据库配置:对象、属性、关系与 configdb 的落库机制

2.1 对象的定义:主对象、持久性与级别的取舍

数据库配置里的“对象”对应数据库中的一张表。新建对象时只需要填对象名和描述,命名一般用业务对应的英文或英文简写,例如资产对应 ASSET,工单对应 WORKORDER。新建出来的对象状态是“待添加”,此时去数据库里查表是查不到的,只有执行过 configdb 后表才会真正建出来。这个“两步走”的机制是整个模块最重要的心智模型,后面所有改字段、建关系都遵循同一套规则。

三个关键开关在新建对象时必须想清楚:

  • 主对象:只有勾选了主对象,这个对象才能被创建工作流程。资产、工单、位置这类核心对象都是主对象,普通从属表一般不设。
  • 持久性:默认选中。勾选后 configdb 会在数据库建表,数据可以落库;取消勾选则变成虚拟对象,configdb 后也不存在对应表,数据无法保存,只能运行时临时用,用完即丢。虚拟对象通常用于计算中间量或组装界面展示用的临时结构。
  • 级别:默认 SYSTEM,常用还有 ORG 和 SITE。SITE 级别强制要求属性里必须有 SITEID 和 ORGID 两个字段,ORG 级别则必须有 ORGID。这是 Maximo 做数据隔离的底层依据,配错级别会导致组织或站点维度取数失败。

对象还有一个“类”的概念,默认绑定系统标准的psdi.mbo.custapp.CustomMboSet。类决定了这个对象在对象级别的操作行为,例如新建、删除、保存时执行什么逻辑。需要自定义时,可以写自己的 MboSet 子类并在这里绑定,这属于第四章要展开的扩展内容。

2.2 属性:七种配置项与类型选型

对象的属性就是表的字段。新建对象时系统会自动生成两个字段:一个是“对象名+ID”,作为唯一标识,值不能重复;另一个是 DESCRIPTION,用于描述。实际业务字段全部手动添加,添加后同样要 configdb 才会在数据库表中生成列。

属性类型是最容易选错的地方。常用类型如下表:

类型可存内容典型场景
ALN汉字、字母、数字名称、描述、备注
UPPER大写字母,输入小写自动转大写资产编号、工单号
DATE日期(年月日)计划开工日期
DATETIME时间(年月日时分秒)实际完成时间
DECIMAL数字,默认两位小数,可自定义数量、金额
INTEGER整数数量、序号
YORN只有 1 或 0复选框绑定的字段

属性页里还有六个容易忽略的配置项。等同属性让当前属性与目标属性的类型、长度保持联动,改一边另一边跟着变;其中有一条铁律:ORGID 必须等同于 ORGANIZATION 的 ORGID,SITEID 必须等同于 SITE 的 SITEID。搜索类型决定这个字段能否出现在搜索对话框中,没设置搜索类型的字段在搜索框里是查不到的。虚拟字段不落库,靠运行时逻辑算出来。缺省值是在用户什么都没输入时自动带入的值。自动编号用于生成唯一序列号,比如工单号自动递增。字段绑定类关联一个 Java 类,用来做字段级的校验或值变更联动,比如输入数量后自动联动金额。

2.3 关系、索引与 configdb:改完对象必须做的最后一步

关系是对象之间的业务关联定义,类似数据库外键,但更偏向业务导航。配置好关系后,父对象可以便捷地获取到子 MboSet,在列表、表格和 Java 代码里直接通过关系名取数。索引则是给字段建查询加速结构,高频查询字段建议加索引,但不要滥用,索引过多会影响写入性能。

所有对象、属性、关系的变更,都在 configdb 这一步才真正落到数据库。修改对象信息后系统会给对应对象打上状态标记,configdb 时根据标记去修改数据库表结构。培训练习题里的 test 和 testline 就是典型的主从对象练习:先建 test 主表,再建 testline 明细表,然后通过关系把两者关联起来,最后 configdb,确认表结构真的变了。

梳理下来会发现,最容易忽略的不是“怎么建对象”,而是“建完之后忘了 configdb”。很多新人在设计器里看不到自己新加的字段,多半就是只改了定义没有同步数据库。从那之后凡是动过对象或属性,我都会先看一眼界面右上角有没有未同步的标记,有就立刻执行 configdb。

3. 域与应用设计器:值校验、控件与界面组装的协作

3.1 域:先于界面生效的值规则

域是 Maximo 里独立于对象的一层配置,用来约束属性可以取哪些值。它的作用是给属性划定一个合法的值集合,用户在这个属性上输入不在此集合内的值时,系统会阻止保存。域的完整配置链路是:添加域 → 编辑域值 → 在属性上绑定域。

添加域时先给域起名并确定它的值范围,然后进入域值编辑页面,逐条维护允许的值。每个值一般包含值和描述两项,例如状态域里可以有“已提交”“已批准”“已完成”几个条目。最后在数据库配置的属性页里把这个域绑上去,属性就生效了。

实际使用时要区分两种值来源:一种是域里预先写死的固定值,另一种是表驱动的动态值。固定值适合状态、类型这类枚举;表驱动的域则从某张业务表里取值,适合动态字典,比如从人员表里取所有有效人员。域本身不关心界面用什么控件,控件只是展示,真正的合法性校验发生在数据层,这也是一开始在数据库配置里就绑定域的原因——绕开界面直接写数据时,域校验依然生效。

3.2 应用设计器的界面骨架:显示、标签页组、标签页与部分

应用程序设计器是组装界面的地方,它的层级结构可以理解为“应用 → 显示 → 标签页组 → 标签页 → 部分 → 部分列 → 控件”。每一层管一块区域,层级嵌套关系清楚了,拖控件时才不会乱。

控件选用板是左侧的控件仓库,拖到画布上就能用。选中控件后,右侧控件属性面板决定它的行为:绑定哪个属性、是否必填、是否只读、默认值是多少。控件属性里最容易踩的一个点是把“必填”放在控件层而不是数据层,导致数据从后台写入时绕过界面校验——所以必填约束尽量在对象或域层面定义,界面只负责提示。

标签页组和标签页用来组织信息模块,比如一个工单应用可以有“工单信息”“计划”“实际”几个标签页。部分和部分列是更细的布局单元,用来把同一区域里的字段分列排放。多部分文本框适合拆分的编码类字段,比如“区号-号码”一次录入自动拼成完整值;文本框就是普通单值输入。表控件和表列用于承载主从结构中的明细记录,相当于界面上直接内嵌一个子表。复选框绑定 YORN 字段,显示为勾选状态;附件控件挂文件;帮助格显示辅助说明信息;按钮控件则是后面接 Java 动作的入口。

3.3 应用导入导出、编辑对话框、签名选项与选择操作

应用设计器不只是拖控件。导入和导出功能用于把整个应用定义从一个环境搬到另一个环境,开发环境调好的界面导出后导入到测试或生产环境,能省下大量重复手工搭建的时间。编辑对话框配置弹窗版编辑界面,适用于在列表页直接编辑某条记录的字段。签名选项控制哪些操作需要二次确认,例如删除记录时要求输入用户名和密码,防止误操作。选择操作允许在菜单里挂额外的动作入口,这些动作通常对应 Java 代码里的方法;工具栏菜单则是自定义顶部按钮的入口。

这章的重点是理解“界面只是壳”。文本框、复选框、表这些都只是展示和输入载体,真正的数据校验、默认值、自动编号、权限控制早就在数据库配置和域里定好了。设计器里改控件属性能影响交互,但影响不了数据规则。

4. 扩展程序:MBO 类与 Bean 类的职责划分

4.1 程序的四种 Java 类:先分清楚谁管数据、谁管界面

Maximo 的二次开发代码可以归纳为四个大类:MBO 类里细分为字段类、流程操作类和 MboSet/Mbo 类,BEAN 类里细分为应用程序主类、tablebean 类和选择对话框类。区分它们的口诀是:MBO 管数据和业务逻辑,BEAN 管界面动作和交互。

程序路径决定了你的代码放在哪个 class 目录、类名怎么写、系统按什么规则加载。写代码前先确定路径,否则类找不到是最常见的低级错误。

4.2 字段类与流程操作类:字段级和对象级的逻辑

字段绑定类以MboValueAdapter为基础,它监听某个字段的值变化。典型用途:用户输入数量后自动算总价、输入设备编码后自动带出设备名称、保存前校验某个字段的合法性。示例结构如下:

public class CustomField extends MboValueAdapter { public CustomField(MboValue mbv) { super(mbv); } @Override public void validate() throws MXException, RemoteException { // 字段校验:拿到当前值,不满足条件则抛出异常 String val = getMboValue().getString(); if (!"Y".equals(val) && !"N".equals(val)) { throw new MXException("只能输入 Y 或 N"); } } @Override public void action() throws MXException, RemoteException { // 值变更后的联动逻辑:修改同记录的其他字段 if (getMboValue().getInt() > 100) { getMboValue().getMbo().setValue("DESCRIPTION", "大额记录", 11L); } } }

validate 方法负责校验,action 方法负责值变化后的联动动作。字段绑定的路径就写在数据库配置的属性页里,写完编译后要重新加载类,否则系统仍用旧逻辑。

MAXTableDomain是域校验相关的绑定类,一般配合域使用,在 Java 层面扩展域的统计算法。流程操作类则定义对象级操作,比如新建、删除、保存、状态流转时的额外业务处理,绑定到对象的“类”上。

4.3 BEAN 类:应用主类、tablebean 与选择对话框

应用程序主类管理应用的生命周期,包含初始化、页面加载、工具栏按钮动作等。工具栏按钮上配置的“执行 Java 方法”就指向这个类里的方法。tablebean 类管理界面上的表格行为,例如表按钮点击后对表格选中行做什么处理。选择对话框类分多选和单选两种:多选用于“批量选择资产”“批量指派人员”这种场景,单选用于“只能选一个父对象”的场景。选择对话框的代码核心是接收选择结果、回填到目标字段,然后按需触发后续校验。

4.4 MboSet 与 Mbo:数据操作的编程入口

MboSet 可以理解为一批 Mbo 记录的集合,Mbo 是单条记录。MboSet 的操作包括查询、遍历、新增、删除、保存;Mbo 的操作包括取值、赋值、获取父级、获取子集、初始化、删除。先用 MXSession 建立连接,再通过getMboSet取数:

MXSession session = MXServer.getMXServer().getMXSession("USER", "PASSWORD"); MboSetRemote assetSet = session.getMboSet("ASSET"); assetSet.setWhere("STATUS = '运行中'"); assetSet.reset(); // 遍历并读取字段 MboRemote asset = assetSet.moveFirst(); while (asset != null) { System.out.println("资产编号:" + asset.getString("ASSETNUM")); asset = assetSet.moveNext(); }

Mbo 的生命周期顺序很关键:新建时先add(),再 setValue 赋值,最后save();保存后系统才生成正式的主键和唯一标识。初始化逻辑写在init()里,delete 写在继承方法里。很多初学的人直接在构造器里写初始化逻辑,导致某些场景下字段还没加载就取不到值——正确做法是重写init()。

写扩展程序最容易翻车的地方是分了类却没搞清楚调用时机:字段类在属性层面触发,流程操作类在对象操作时触发,bean 类在界面动作时触发。想在保存后做联动,就要选对层的代码,否则看代码怎么都发现不了为什么不执行。

5. 权限与后台任务:配置路径与易漏点排查

5.1 权限组的创建与应用程序授权

权限体系的链路是:权限组 → 授权应用 → 数据限制 → 用户入组。先创建权限组,例如给仓库操作员建一个“STORE_OP”组;然后在应用授权里勾选该组可以访问哪些应用程序、每个应用里有没有新增、修改、删除的权限。最后把用户加进权限组,登录后系统按组解析出全部权限。

常见误区是给用户授予了某应用入口,但应用内的按钮还是灰色或不可用——因为这属于签名选项和密钥权限的范畴,要检查该操作有没有被单独授权。系统应用的授权粒度分到“操作”级别,新增、修改、删除、审批各有各的权限开关,不能只授一个总开关。

5.2 对象限制与属性限制:行与列的两种数据边界

数据限制分对象限制和属性限制,这两者经常被混为一谈。

对象限制是行级过滤,相当于给这个权限组对某对象的查询加一个固定的 where 条件。例如限制仓库操作员只能看到“状态=已接收”的工单,在对象限制里写条件即可。属性限制是列级控制,决定某权限组的用户在界面上能不能看到、能不能编辑某个字段。例如采购员看不到成本字段,或看到了但不能修改。

  • 对象限制:控制能看到哪些行 → 相当于数据库查询条件
  • 属性限制:控制能看到和编辑哪些列 → 相当于界面字段级权限

两条规则叠加使用时要特别小心:属性限制隐藏字段,但对象限制并未排除该字段相关数据,后台导数据时字段依然在。如果既想隐藏又想隔离,必须两层一起配。

5.3 后台任务的创建、实例与启用

后台任务用于执行定时或批处理逻辑,完整链路是:创建后台任务程序 → 创建后台任务实例 → 配置参数 → 启用并运行。后台任务程序里绑定处理类,决定任务执行时跑什么代码;实例则是一次具体运行的计划,决定任务什么时候跑、跑哪些数据、参数是什么。

配置实例时最重要的检查项是“启用”状态和“运行时间”。很多人创了实例却忘了启用,到点任务毫无反应;或者实例启用了,但参数里对象名写错,导致批处理对空集合跑了一遍。更新任务逻辑后,也要重新测试实例,否则线上跑的还是旧逻辑。后台任务的日志是排查第一现场,任务失败先看异常栈里反馈的是哪个环节。

5.4 权限与后台任务的五个高频易漏点

  • 易漏点:应用程序授权给了,但操作级权限没给具体动作。现象是用户能进应用却新增不了。原因是系统对新增、删除等动作的授权是独立的。补法是逐项检查应用下每个动作的勾选状态。
  • 易漏点:对象限制的 where 条件写错或没覆盖所有站点。现象是数据时有时无。原因是条件里少了 ORGID 或 SITEID 维度。补法是先不加限制测一次看全集,再加限制对比差异。
  • 易漏点:属性限制与对象限制用混。现象是字段在列表隐藏了,但明细或报表里仍能取出值。原因是不理解行级与列级是两个维度。补法是按“行看对象限制、列看属性限制”的原则重新拆分。
  • 易漏点:后台任务实例创建后未启用。现象是定时任务从没触发过。原因是实例默认不启用。补法是创建后立即进入实例列表确认计划状态,首次先手动跑一遍验证参数。
  • 易漏点:改了任务逻辑只重新编译,没有重新部署类或重启容器。现象是任务跑完结果和旧逻辑一致。原因是后台任务的类加载没有自动热更新。补法是发布代码后重启服务并观察一次完整执行日志。

6. 复习清单:按对象到权限的数据流自查一遍

到这里整条链路已经走完:数据库配置定义表和字段,域约束值,应用设计器组界面,Java 程序接行为,权限和后台任务控制边界与调度。复习时不要按章节顺序从头翻,而是顺着一条业务数据的生命周期过一遍,效率高得多。

我的复习方法是六步自查:

  1. 建表层:对象有没有设持久性?级别是 ORG 还是 SITE?关键字段齐全吗?改完 configdb 了吗?
  2. 字段层:类型选对没有?YORN 字段绑复选框了吗?等同属性没配错吧?
  3. 值规则层:哪些字段需要校验范围?域建了吗?属性上绑了没有?
  4. 界面层:控件绑的属性名对不对?多部分文本框用对场景没有?入出对话框挂好没?
  5. 逻辑层:字段联动写在哪一层?校验应该在 validate 还是 action?按钮方法指到 bean 类哪个方法了?
  6. 边界层:谁有权限看?行级限制的 where 条件覆盖全组织没有?定时任务实例启用没有?

每次带新学员时我都会让他们拿一张新建的业务表格,从建对象开始走完这六步,能走通就说明脉络通了。从那以后我每次接到新的定制需求,都强制自己先画一遍这张数据流图再动手,省掉了大量改到一半才发现“源头就没设对”的返工。希望这份复习笔记能帮到你,把翻过就忘的细节变成随时可以自查的清单。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进