简介:本资源是一份面向IT运维工程师、资产管理系统实施人员及Maximo初学者的入门级培训文档,聚焦Maximo平台核心配置能力培养,解决企业级资产与工单管理系统的部署与定制化基础问题。文档以Word格式(.doc)单文件呈现,体积5.96MB,内容结构清晰,覆盖数据库配置与属性配置两大核心模块:第一章详述对象建模(含主对象、新建对象、类、级别、持久性)、数据库连接设置及configdb工具使用;第二章深入属性定义机制,包括类型与长度约束、等同属性复用、虚拟字段、缺省值、自动编号及字段绑定类等关键实践要点。所有知识点均配有操作逻辑说明与典型应用场景提示,便于读者边学边练、快速上手系统定制。目前已有254人学习下载,是理解Maximo数据模型底层逻辑、开展二次开发与流程配置的重要参考材料。
1. Maximo基本培训文档:不是说明书,是能直接上手改数据库、搭界面、写后台逻辑的实操手册
你刚接手一个Maximo项目,客户提了三个需求:
- 要在工单里加一个“维修耗时(小时)”字段,支持小数点后一位;
- 要新建一个“备件领用申请”应用,带表格+附件+多选弹窗;
- 还要让这个申请只对某几个站点可见,且审批人只能看到自己负责的那部分数据。
翻遍官方文档,全是概念堆砌;查CSDN博客,代码片段断在关键处,缺类路径、少configdb触发步骤、没权限组绑定细节——最后卡在“保存后数据库没建表”“点击按钮没反应”“授权后还是403”这种玄学现场。
这份《Maximo基本培训.doc》就是为这类场景写的:它不讲“什么是MBO”,而是告诉你新建对象后必须点哪三个按钮才能让数据库真生成testline表;不罗列“域有几种类型”,而是用练习题逼你亲手把YORN字段绑到复选框、再验证前端是否同步显示“是/否”;不空谈“BEAN类作用”,而是给出tablebean中handleButtonEvent()方法里getMboSet().moveTo(0)和fireStructureChanged()的调用顺序——错一步,列表就刷不出来。
它面向的是已经部署好Maximo环境、有WebSphere或Jboss基础、能进Admin Console但还没摸清psdi.mbo.*包体系的一线实施工程师或内部开发。整份文档按真实工作流组织:先动数据库(对象→属性→关系→configdb),再搭界面(控件拖拽→绑定域→签名选项),接着写逻辑(MBO增删改→tablebean事件→后台任务调度),最后锁权限(组→应用授权→对象级限制)。所有操作都落在具体菜单路径、按钮名称、配置项勾选状态上,没有一句“理论上可以……”。
提示:这不是入门扫盲材料。如果你连Maximo登录页都还没见过,建议先完成标准安装验证(确保
maximo.ear已部署、maxadmin账号可登录、Database Configuration应用能打开)。本文档默认你已具备该前提。
2. 数据库配置:从新建对象到configdb落地的四步闭环
Maximo的数据库配置不是SQL DDL脚本执行器,而是一套元数据驱动的声明式建模工具。它的核心矛盾在于:你在界面上做的所有改动,只是在内存中修改了对象定义快照,真正的数据库表变更,必须经过configdb这道闸门。跳过它,或者中途失败,就会出现“界面上能看到新字段,但数据库表里没有对应列”的经典翻车。
2.1 新建对象:主对象、持久性、级别三要素必须一次选对
新建对象的操作路径:Database Configuration→ 工具栏New Object按钮 → 输入Name(如TESTLINE)、Description(如测试明细表)。此时关键配置项如下:
| 配置项 | 可选项 | 必须选择理由 | 血泪经验 |
|---|---|---|---|
| Main Object | ✓ / ✗ | 必须勾选。只有主对象才能被工作流引擎识别,后续若要为TESTLINE建审批流,此处不勾则流程设计器里根本找不到该对象 | 曾有项目因漏勾此选项,导致流程发布后始终无法触发,排查3天才发现对象非主对象 |
| Persistent | ✓ / ✗ | 必须勾选。不勾选即为虚拟对象(Virtual Object),configdb后数据库无表,也无法持久化数据。业务表99%需勾选 | 某导师演示时故意不勾,结果学员误以为“虚拟对象=临时表”,上线后数据全丢 |
| Level | SYSTEM / ORG / SITE | 根据业务范围选。若TESTLINE仅限某站点使用,选SITE;若跨组织共享,选ORG;若全系统通用(如ASSET),选SYSTEM。选错会导致后续字段约束报错 | SITE级对象必须含SITEID和ORGID字段,否则configdb直接失败,错误日志只提示“level validation failed” |
# configdb执行命令(Linux环境) cd $MAXIMO_HOME/tools/maximo ./configdb.sh -d DB2 -u maximo -p maximo -s MAXIMO注意:
configdb.sh参数中的-d指定数据库类型(DB2/Oracle/SQLServer),-s是数据库实例名(非URL),务必与maximo.properties中mxe.db.name一致。执行前确认$MAXIMO_HOME已正确设置,且当前用户对tools/maximo目录有执行权限。
2.2 属性配置:类型、等同属性、搜索类型的硬约束
对象建好后,点开Attributes标签页添加字段。以TESTLINE为例,需添加DURATION(维修耗时)字段:
类型与长度:
Type选DECIMAL,Length填10,Scale填1(小数点后1位)。为什么不是
ALN?因为ALN存文本,无法参与数值计算(如工单总耗时求和);为什么Scale=1?客户明确要求“精确到0.1小时”,Scale=0会强制取整。等同属性(Equiv Attribute):若
DURATION需与WORKORDER表的ACTUALDURATION保持一致(同类型、同精度),则在此处输入WORKORDER.ACTUALDURATION。关键逻辑:等同属性是双向同步的。改
WORKORDER.ACTUALDURATION的Scale为2,TESTLINE.DURATION的Scale也会自动变为2。生产环境慎用,避免误触核心表。搜索类型(Search Type):必须设为
WILDCARD(模糊搜索)或EXACT(精确匹配)。若不设,该字段在应用界面的查询区域将不可见。玄学现象:
DURATION设为EXACT后,在工单查询页输入5.5能搜到,但输入5搜不到(因数据库存的是5.0)。此时应改用WILDCARD,或前端加LIKE '5.%'处理。
2.3 关系与索引:让关联查询不变成全表扫描
TESTLINE需关联到WORKORDER(工单主表),关系配置路径:Relationships标签页 →New Relationship→ 填写:
Relationship Name:TESTLINEWO(命名规则:子表+主表缩写)Parent Object:WORKORDERChild Object:TESTLINEWhere Clause:workorderid = :workorderid(注意冒号语法,表示引用父对象字段)
为什么必须写
Where Clause?Maximo不自动生成ON条件。漏写会导致关联查询返回笛卡尔积,10万条工单 × 100条明细 = 1000万行,页面直接卡死。
索引配置在Indexes标签页,为TESTLINE的workorderid字段建索引:
Index Name:TESTLINE_WOID_IDXUnique: ✗(非唯一索引,因一个工单可有多条明细)Columns: 添加workorderid字段,并设Order为ASC
-- configdb后实际生成的SQL(Oracle示例) CREATE INDEX TESTLINE_WOID_IDX ON TESTLINE (WORKORDERID ASC);排查技巧:若关联查询极慢,登录数据库执行
EXPLAIN PLAN FOR SELECT ... FROM TESTLINE t, WORKORDER w WHERE t.workorderid=w.workorderid,看执行计划是否走索引。未走索引则检查索引名是否含非法字符(如空格)、字段名大小写是否与数据库实际列名一致。
2.4 configdb全流程避坑:从标记到生效的五个关键节点
configdb不是一键执行,而是分阶段校验、生成、执行。以下五步任一失败,都会导致“界面有、库中无”:
| 现象 | 原因 | 解决 |
|---|---|---|
执行configdb.sh后提示No changes to process | 对象/属性修改后未点击Save,或修改状态未被标记为ADD/CHANGE。检查对象列表右侧Status列,应为Add或Change,而非None | 返回Database Configuration界面,对目标对象右键 →Save,再刷新列表确认状态已更新 |
configdb.sh报错ORA-00942: table or view does not exist | 当前用户maximo无CREATE TABLE权限,或MAXIMO模式下已存在同名表但无DROP权限 | 用DBA账号执行GRANT CREATE TABLE TO maximo; GRANT DROP ANY TABLE TO maximo;,或手动DROP TABLE TESTLINE后再试 |
configdb成功,但数据库中TESTLINE表无DURATION字段 | 字段添加后未保存,或Status列为None。configdb只处理标记为ADD/CHANGE的属性 | 进入Attributes页,找到DURATION行,确认Status为Add,右键Save,再执行configdb |
configdb后TESTLINE表存在,但workorderid字段为NULLABLE=Y | 关系配置中未勾选Required,导致外键字段允许为空。业务上workorderid必填,必须强制非空 | 编辑关系TESTLINEWO,勾选Required,再执行configdb(会生成ALTER TABLE TESTLINE MODIFY WORKORDERID NOT NULL) |
configdb成功,但Maximo应用重启后TESTLINE对象在应用设计器里找不到 | configdb只更新数据库,未刷新Maximo缓存。需手动清除$MAXIMO_HOME\applications\maximo\businessobjects下的编译文件 | 执行$MAXIMO_HOME\tools\maximo\buildmaximo.bat(Windows)或buildmaximo.sh(Linux),重建businessobject jar |
提示:生产环境执行configdb前,务必备份
maximo.properties和数据库MAXIMO模式。configdb不可逆,一旦执行,无法回滚到前一版本(除非用数据库备份恢复)。
3. 应用程序设计器:从拖控件到签名选项的完整链路
数据库建完,下一步是让业务用户能看见、能操作这些数据。Maximo的应用程序设计器(Application Designer)不是低代码平台,而是基于XML模板+Java BEAN的混合开发环境。它的核心逻辑是:界面控件(Presentation)绑定数据源(MboSet),数据源由MBO类驱动,而MBO类的行为由签名选项(Signature Options)控制权限。漏掉任一环,轻则功能缺失,重则权限失控。
3.1 控件选用板:哪些控件必须配域,哪些必须写BEAN
Application Designer的控件面板(Control Palette)分两类:
- 声明式控件(Declarative):如
Text Box、Check Box、Table,只需绑定属性(Attribute)和域(Domain),无需写Java代码。 - 行为式控件(Behavioral):如
Pushbutton、Attachments、Help Grid,必须关联BEAN类(如psdi.webclient.beans.pushbutton.PushButtonBean),否则点击无响应。
以TESTLINE应用为例,需添加:
- 一个
Table控件展示明细列表; - 一个
Pushbutton触发“导出Excel”; - 一个
Attachments控件上传维修照片。
关键配置:
Table的Data Source必须设为TESTLINE(即MboSet名),Table Column的Attribute设为DURATION;Pushbutton的Bean Class填psdi.webclient.beans.pushbutton.PushButtonBean,Method填exportToExcel(需确保该方法在BEAN中已实现);Attachments的Bean Class填psdi.webclient.beans.attachments.AttachmentsBean,Mbo Name填TESTLINE。
为什么
Table不写BEAN也能显示?因为Table是声明式控件,其数据加载由框架自动调用getMboSet().execute()完成。而Pushbutton是行为式控件,框架只负责渲染按钮,点击后的逻辑必须由BEAN的handleEvent()方法实现。
3.2 签名选项:权限控制的最终闸门
签名选项(Signature Options)是Maximo权限模型的基石。它不控制“谁能看这个应用”,而是控制“在这个应用里,谁能执行哪个操作”。配置路径:Application Designer→ 选中应用 →Select Action→Signature Options。
以TESTLINE应用为例,需配置:
ADDRECORD:允许新增明细;DELETE:允许删除;EXPORT:允许导出;ATTACHFILE:允许上传附件。
关键逻辑:签名选项本身不生效,必须与权限组(Security Group)绑定。例如,给
MAINTENANCE组授予TESTLINE应用的ADDRECORD和DELETE权限,该组成员才能新增/删除明细;若未授EXPORT,即使界面上有导出按钮,点击也会提示“Access denied”。
3.3 导入导出应用:跨环境迁移的黄金法则
应用设计完成后,不能直接在生产环境修改,必须通过导入导出。导出路径:Application Designer→Export Application→ 选择TESTLINE→ 保存为TESTLINE.xml。
导入到另一环境(如UAT):
- 登录UAT环境的
Application Designer; Import Application→ 选择TESTLINE.xml;- 勾选
Overwrite existing application(覆盖同名应用); - 点击
Import。
血泪经验:导入失败常见原因有三:① XML中引用的域(如
TESTLINE_STATUS)在目标环境不存在,需先导入域;② 应用依赖的MBO类(如psdi.app.testline.TestLineSet)未部署,需先编译打包jar并放入$MAXIMO_HOME\applications\maximo\lib;③ XML中appname="TESTLINE"与目标环境已存在应用名冲突,需先在UAT中Delete Application。
3.4 常见问题排查:界面不显示、按钮无响应、附件上传失败
| 现象 | 原因 | 解决 |
|---|---|---|
TESTLINE应用打开后表格为空,无任何报错 | Table控件的Data Source未设为TESTLINE,或TESTLINEMboSet未在maximo.properties中注册 | 检查maximo.properties是否有mxe.db.object.TESTLINE=psdi.app.testline.TestLineSet,无则添加并重启服务器 |
点击Export按钮无反应,浏览器控制台无JS错误 | Pushbutton的Bean Class未指定,或指定的BEAN类中exportToExcel()方法未实现@Override public void handleEvent() | 查看$MAXIMO_HOME\applications\maximo\businessobjects\src\psdi\webclient\beans\pushbutton\下对应BEAN,确认方法签名和注解正确 |
Attachments控件显示“Upload File”,但点击后无文件选择框 | Attachments控件的Mbo Name填错(如填成TEST而非TESTLINE),或TESTLINE对象未启用附件功能(需在Database Configuration中勾选Allow Attachments) | 进入Database Configuration→ 找到TESTLINE对象 →Attachments标签页 → 勾选Enable Attachments,再configdb |
应用导入后,DURATION字段显示为0.0,无法编辑 | 字段DURATION的Readonly属性在Application Designer中被勾选,或绑定的域(Domain)设置了Readonly规则 | 在Application Designer中双击DURATION字段 →Properties→ 取消勾选Readonly;检查域TESTLINE_DURATION的Default Value是否为0.0,若是则清空 |
提示:每次修改应用后,务必清除浏览器缓存(Ctrl+F5强制刷新),并检查Maximo日志
$MAXIMO_HOME\logs\maximo.log中是否有ERROR级别报错,关键词如NullPointerException、ClassNotFoundException。
4. MBO与BEAN开发:从字段校验到后台任务的代码实操
当标准配置无法满足业务逻辑时(如“维修耗时必须大于0且小于24小时”),就必须写Java代码。Maximo的扩展开发分两层:MBO层(Model)处理数据规则,BEAN层(View)处理界面交互。二者通过MboSet桥接,形成MVC变体。
4.1 MBO类:TestLine的init()与save()校验
TestLine是TESTLINE对象对应的MBO类,继承Mbo。核心方法:
// src/psdi/app/testline/TestLine.java public class TestLine extends Mbo implements TestLineRemote { @Override public void init() throws MXException, RemoteException { super.init(); // 初始化时,若DURATION为空,则设为0.0 if (getDouble("DURATION") == 0.0) { setValue("DURATION", 0.0, NOACCESSCHECK); } } @Override public void save() throws MXException, RemoteException { super.save(); // 保存前校验:DURATION必须>0且<24 double duration = getDouble("DURATION"); if (duration <= 0 || duration >= 24) { throw new MXApplicationException("testline", "DURATION_INVALID", new Object[]{duration}); // 抛出预定义错误,需在maximo.ear中配置资源文件 } } }参数说明:
setValue("DURATION", 0.0, NOACCESSCHECK)中的NOACCESSCHECK跳过权限检查,避免初始化时因字段只读而失败;MXApplicationException的"testline"是资源包名,"DURATION_INVALID"是错误码,需在$MAXIMO_HOME\applications\maximo\resources\maximoresources.jar中定义对应提示语。
4.2 tablebean类:TestLineTableBean的按钮事件处理
TestLineTableBean继承TableBean,处理表格级操作。例如,为“批量审核”按钮写逻辑:
// src/psdi/webclient/benas/testline/TestLineTableBean.java public class TestLineTableBean extends TableBean { @Override public int execute() throws MXException, RemoteException { // 重写execute(),在表格加载前执行 MboSetRemote testLineSet = getMboSet(); testLineSet.setWhere("status='DRAFT'"); // 只加载草稿状态 return super.execute(); } public void approveSelected() throws MXException, RemoteException { // 获取选中行 MboSetRemote selectedSet = getMboSet().getSelection(); for (int i = 0; i < selectedSet.count(); i++) { MboRemote mbo = selectedSet.getMbo(i); mbo.setValue("status", "APPROVED", NOACCESSCHECK); } // 刷新表格 fireStructureChanged(); } }关键点:
fireStructureChanged()必须调用,否则界面不刷新;getSelection()返回的是当前选中行的MboSet副本,修改后需显式调用save()(框架自动处理)。
4.3 后台任务:TestLineCleanupTask的定时清理
需每天凌晨2点清理7天前的草稿明细。后台任务开发三步:
- 创建任务类(
TestLineCleanupTask.java):
public class TestLineCleanupTask implements ScheduleTask { @Override public void start(TaskSchedule schedule) throws MXException, RemoteException { // 获取TESTLINE MboSet MboSetRemote testLineSet = getMboServer().getMboSet("TESTLINE"); // 设置WHERE条件:草稿且创建时间早于7天 Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, -7); String where = "status='DRAFT' AND createddate < '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime()) + "'"; testLineSet.setWhere(where); testLineSet.reset(); // 删除所有匹配记录 while (testLineSet.count() > 0) { testLineSet.getMbo(0).delete(); } testLineSet.save(); } }- 在
maximo.properties中注册:
mxe.scheduler.task.TestLineCleanupTask=psdi.app.testline.TestLineCleanupTask- 在
Cron Task Setup应用中创建实例:
Task Name:TESTLINECLEANUPClass Name:TestLineCleanupTaskCron Expression:0 0 2 * * ?(每天2点)Active: ✓
注意:
Cron Expression格式为秒 分 时 日 月 周 年,Maximo不支持年字段,填?即可;Active必须勾选,否则任务不启动。
4.4 MBO与BEAN联调避坑:数据不同步、方法不触发
| 现象 | 原因 | 解决 |
|---|---|---|
TestLine的save()方法未执行,数据直接入库 | TestLine类未在maximo.properties中注册,或TESTLINE对象的Class字段未指向该类 | 检查maximo.properties是否有mxe.db.object.TESTLINE=psdi.app.testline.TestLine,并在Database Configuration中确认TESTLINE对象的Class字段值为此字符串 |
TestLineTableBean的approveSelected()方法抛NullPointerException | getMboSet()返回null,因TableBean未正确绑定到TESTLINE数据源 | 在Application Designer中,选中Table控件 →Properties→Data Source必须为TESTLINE,且TESTLINEMboSet已在maximo.properties中注册 |
后台任务执行后,日志显示0 records deleted,但数据库中有草稿数据 | Cron Expression时区错误(Maximo默认UTC,服务器为CST),或createddate字段类型为DATETIME但WHERE条件用了字符串比较 | 改用setQbe()方法:testLineSet.setQbe("status", "DRAFT"); testLineSet.setQbe("createddate", "<" + cal.getTime());,由框架生成正确SQL |
提示:所有自定义Java类必须编译为
.class文件,放入$MAXIMO_HOME\applications\maximo\businessobjects\classes,并执行buildmaximo.bat/sh重新打包businessobjects.jar,最后重启应用服务器。
5. 权限与后台任务:从数据隔离到自动化运维的闭环
权限不是“给用户开个账号”,而是构建一张细粒度的访问控制网;后台任务也不是“写个定时脚本”,而是嵌入Maximo生命周期的可靠服务。二者结合,才能实现“某站点人员只能看本站点工单,且每日自动归档历史数据”的生产级需求。
5.1 权限组与数据限制:对象级与属性级的双重锁
MAINTENANCE权限组需限制TESTLINE数据:
对象限制(Object Restriction):
- 进入
Security Groups→MAINTENANCE→Data Restrictions→Add Row; Object:TESTLINE;Where Clause:siteid = :USERINFO.SITEID(动态获取当前用户所在站点)。
- 进入
属性限制(Attribute Restriction):
- 同一页面 →
Attribute Restrictions→Add Row; Object:TESTLINE;Attribute:DURATION;Restriction:READONLY(仅查看,不可编辑)。
- 同一页面 →
关键逻辑:
Where Clause中的:USERINFO.SITEID是Maximo内置变量,自动替换为当前用户PERSON记录中的SITEID值。若用户无SITEID(如超级管理员),该限制不生效,符合“管理员全局可见”预期。
5.2 后台任务实例化:从配置到监控的完整链路
TESTLINECLEANUP任务创建后,需验证其可靠性:
手动触发测试:
- 进入
Cron Task Setup→ 找到TESTLINECLEANUP→Action→Run Now; - 查看
$MAXIMO_HOME\logs\maximo.log,搜索TESTLINECLEANUP,确认有Deleted X records日志。
- 进入
监控任务状态:
- 进入
Cron Task Status应用,筛选Task Name = TESTLINECLEANUP; - 关键字段:
Last Run Time(最后执行时间)、Next Run Time(下次执行时间)、Status(ACTIVE/INACTIVE)。
- 进入
失败告警配置:
- 在
Cron Task Setup中,勾选Send Email on Failure; Email Address: 运维邮箱;Failure Threshold:1(失败1次即发邮件)。
- 在
血泪经验:曾有任务因
TestLineCleanupTask中getMboServer()返回null而失败,原因是未在构造函数中调用super()。正确写法:public class TestLineCleanupTask implements ScheduleTask { private MboServerRemote mboServer; @Override public void start(TaskSchedule schedule) throws MXException, RemoteException { this.mboServer = schedule.getMboServer(); // 后续用this.mboServer.get...替代getMboServer() } }
5.3 权限与任务协同:确保自动化不越权
后台任务以MAXADMIN身份运行,不受用户权限组限制。这意味着TESTLINECLEANUP能删除所有草稿,无论siteid为何值。若需按站点清理,必须在任务代码中显式加入权限判断:
public void start(TaskSchedule schedule) throws MXException, RemoteException { MboServerRemote mboServer = schedule.getMboServer(); // 获取所有活跃站点 MboSetRemote siteSet = mboServer.getMboSet("SITE"); siteSet.setWhere("status='ACTIVE'"); siteSet.reset(); for (int i = 0; i < siteSet.count(); i++) { MboRemote site = siteSet.getMbo(i); String siteId = site.getString("SITEID"); // 为每个站点清理其草稿 MboSetRemote testLineSet = mboServer.getMboSet("TESTLINE"); testLineSet.setWhere("siteid = '" + siteId + "' AND status='DRAFT' AND createddate < '" + cal.getTime() + "'"); testLineSet.reset(); // ... 删除逻辑 } }为什么必须这样写?因为
Where Clause中的:USERINFO.SITEID在后台任务中无意义(无用户上下文),必须硬编码或动态枚举站点。
5.4 生产环境终极检查清单
在将TESTLINE方案上线前,我强制自己走一遍以下10步,少一步都可能引发P1故障:
| 步骤 | 操作 | 验证方式 | 不通过后果 |
|---|---|---|---|
| 1 | TESTLINE对象configdb成功,数据库中TESTLINE表存在且含DURATION字段 | SELECT * FROM TESTLINE WHERE ROWNUM=1 | 应用打开即报错MboSet not found |
| 2 | TESTLINEMboSet在maximo.properties中注册 | 检查文件是否存在mxe.db.object.TESTLINE=行 | 自定义MBO逻辑不执行 |
| 3 | TESTLINE应用在Application Designer中导出为XML | 文件大小>1KB,且含<appname>TESTLINE</appname> | 跨环境迁移失败 |
| 4 | TESTLINE应用导入UAT后,能正常打开并显示表格 | 浏览器无JS错误,表格有数据 | 界面白屏 |
| 5 | DURATION字段在应用中可编辑、可保存 | 输入5.5→ 保存 → 刷新后仍显示5.5 | 业务数据无法录入 |
| 6 | MAINTENANCE组成员登录后,TESTLINE表格只显示本站点数据 | 创建两条TESTLINE记录,siteid分别为SITEA和SITEB,用SITEA用户登录只看到一条 | 数据泄露风险 |
| 7 | TESTLINECLEANUP任务手动触发后,日志显示删除记录数 | grep "TESTLINECLEANUP" maximo.log | tail -5 | 历史数据堆积,磁盘爆满 |
| 8 | TESTLINE应用的Export按钮点击后生成Excel文件 | 下载文件,用Excel打开,内容与表格一致 | 用户投诉“导出功能失效” |
| 9 | Attachments控件上传文件后,在Document应用中可查到 | 进入Documents→Find Documents→Owner = TESTLINE | 维修证据无法追溯 |
| 10 | 所有自定义Java类编译无警告,buildmaximo成功 | $MAXIMO_HOME\applications\maximo\businessobjects\classes\psdi\app\testline\TestLine.class存在 | 服务器启动失败 |
从那以后我每次上线新功能,都强制走一遍这10步——不是信不过自己写的代码,而是信不过那个以为“这次肯定没问题”的自己。希望帮到你。
本文还有配套的精品资源,点击获取