项目场景:
项目场景:通过类型为PromotionNotice的数据审批流程发布部件及关联的模型数据,并对模型进行可视化处理,最后将可视化文件传递至生产系统
问题描述
生产系统反馈缺失部分图纸,到PLM系统查阅相关流程发现,流程中是存在这些缺失图纸的,只是这些图纸没有进行可视化处理。
查看系统中获取流程对象的代码:
public static Set<Persistable> getPromotionTargets(PromotionNotice pn) throws WTException {
Set<Persistable> persistables = new HashSet<>();
boolean enforce = SessionServerHelper.manager.setAccessEnforced(false);
try {
QueryResult queryResult = MaturityHelper.service.getPromotionTargets(pn);
while (queryResult.hasMoreElements()) {
Object object = queryResult.nextElement();
if (object instanceof WTPart) {
WTPart part = (WTPart) object;
persistables.add(part);
} else if (object instanceof EPMDocument) {
EPMDocument epm = (EPMDocument) object;
persistables.add(epm);
} else if (object instanceof WTDocument) {
WTDocument doc = (WTDocument) object;
persistables.add(doc);
}
}
} finally {
SessionServerHelper.manager.setAccessEnforced(enforce);
}
return persistables;
}
原因分析:
这里的方法获取的是流程的升级对象,系统中查看流程的升级对象发现数据与表单中的数据不一致,查看流程的相关对象,数据与表单数据是一致的。猜测可能是流程中执行添加数据时导致的,一种可能是添加功能本身异常,只添加到了流程的相关对象,未添加到升级对象,另一种可能就是系统不稳定导致的添加异常。经测试,添加功能是正常的,查看代码,也都有添加相关对象和升级对象的逻辑。暂定此次异常为偶发问题。
解决方案:
如果在不考虑性能的情况下,可以用Set
既收集升级对象又收集相关对象。
也可以只针对流程重要数据处理节点增加流程相关对象的收集。
下面是获取流程对象的方法:
方法一:
QueryResult queryResult = MaturityHelper.service.getPromotionTargets(pn);
方法二:
MaturityBaseline baseline = pn.getConfiguration();
QueryResult queryResult = BaselineHelper.service.getBaselineItems(baseline);
方法三:
Collection<Promotable> items = PromotionNoticeUtils.getPromotionNoticeItems(pn);
以上方法都是获取流程升级对象的方法。
方法四:
String typeName = ObjectTypeUtils.getInternalTypeName(pn);
PromotionNoticeOptions option = PromotionNoticeHelper.getPromotionNoticeOptions(typeName);
String groupId = option.mappingToRelatedObjectGroupId();
RelatedObjectGroupService service = XWorksHelper.getRelatedObjectGroupService();
RelatedObjectGroup group = service.getRelatedObjectGroup(pn, groupId);
List<Persistable> members = service.getMemberObjects(group, GroupMemberType.ALL);
此方法为获取流程相关对象的方法。