【PLM实战】windchill开发之物料描述拼接
一、需求描述
物料描述拼接规则:由每个物料类型的各个属性进行拼接组成,用户可以根据需求,自定义拼接规则的调整
创建部件点击“完成”按钮时,
l 如果物料描述超过40字符,弹窗提示用户,但不阻止部件的创建
l 进行物料描述重复性检查,如果系统中有与当前物料描述相同的物料,提示用户,并列出重复的物料编号和描述,并阻止部件的创建。


二、开发思路
第一种:通过监听器,监听物料操作新增或者修改时进行拼接操作
第二种:通过继承CreatePartAndCADDocFormProcessor,在提交变更时进行拼接操作
由于监听器的触发是在物料生成编号前,所以创建物料时不能使用监听器操作
三、代码示例
第二种思路:创建一个class继承CreatePartAndCADDocFormProcessor
@Override
public FormResult doOperation(NmCommandBean nmCommandBean, List<ObjectBean> paramList) throws WTException {
FormResult formResult = super.doOperation(nmCommandBean, paramList);
ObjectBean localObjectBean = paramList.get(0);
if ("partHandle".equals(localObjectBean.getObjectHandle())) {
WTPart wtPart = (WTPart) localObjectBean.getObject();
IBAUtil ibaUtil = new IBAUtil(wtPart);
logger.debug("开始进行物料描述拼接");
this.setMaterialDesc(wtPart);
//校验物料描述是否重复
logger.debug("进行物料描述重复性校验");
this.checkIBAValue(wtPart, ibaUtil);
}
return formResult;
}
分类属性自定义需要自己在windchill页面配置
public void setMaterialDesc(WTPart wtPart) throws WTException {
boolean enforce = SessionServerHelper.manager.setAccessEnforced(false);
try {
if (null == wtPart) {
return;
}
IBAUtil ibaUtil = new IBAUtil(wtPart);
String classNo = ibaUtil.getIBAValue("CLASSNO");
if (StringUtils.isBlank(classNo)) {
return;
}
StringBuilder sbDesc = new StringBuilder();
String categoryType = (String) DGHelper.type.singleClassDefaultValue(classNo, "分类属性");
if (StringUtils.isBlank(categoryType)) {
throw new WTException("请先配置分类属性:分类属性");
}
if (categoryType.contains("+")) {
String[] attribute = categoryType.split("\\+");
for (int i = 0; i < attribute.length; i++) {
if ("name".equals(attribute[i])) {
sbDesc.append(wtPart.getName() + " ");
} else {
String attribute1 = ibaUtil.getIBAValue(attribute[i]);
if (StringUtils.isNotBlank(attribute1)) {
// 过滤部分属性
if (checkNotShowAttribute(attribute[i], attribute1)) {
sbDesc.append(attribute1 + ",");
}
}
}
}
if (sbDesc.length() > 0) {
sbDesc = sbDesc.deleteCharAt(sbDesc.length() - 1);
}
} else {
if ("name".equals(categoryType)) {
sbDesc.append(wtPart.getName());
} else {
String attribute1 = ibaUtil.getIBAValue(categoryType);
if (StringUtils.isNotBlank(attribute1)) {
// 过滤部分属性
if (checkNotShowAttribute(categoryType, attribute1)) {
sbDesc.append(attribute1);
}
}
}
}
String materialDescStr = sbDesc.toString();
// if(materialDescStr.length() > 40) {
// throw new WTException("物料描述:" + materialDescStr + " 长度超过 40 个字符!");
// }
if (StringUtils.isNotEmpty(materialDescStr)) {
ibaUtil.setIBAValue(PartConst.MaterialDesc, materialDescStr);
ibaUtil.updateAttributeContainer(wtPart);
IBAUtil.updateIBAHolder(wtPart);
}
} catch (RemoteException | ClassNotFoundException | WTPropertyVetoException e) {
logger.error(e.toString());
throw new WTException("生成物料描述失败");
} finally {
SessionServerHelper.manager.setAccessEnforced(enforce);
}
}
校验物料描述长度
public void checkMaterialDesc(IBAUtil ibaUtil) throws WTException { String ibaValue = ibaUtil.getIBAValue(物料描述); if (StringUtils.isBlank(ibaValue)) { return; } if (ibaValue.length() > 40) { throw new WTException("物料描述:" + ibaValue + " 长度超过 40 个字符!"); } }
校验物料是否重复
public void checkIBAValue(WTPart wtPart, IBAUtil ibaUtil) throws WTException { //校验物料描述是否重复 String ibaValue = ibaUtil.getIBAValueOrEmpty(物料描述); logger.info("传入查询的IBA属性值为: " + ibaValue); //获取当前部件得物料编号 String partNum = wtPart.getNumber();
if (ibaValue.isEmpty()) { logger.info("物料描述为空时不做校验: " + partNum); return; }//对应数据库中WTPart表中的idA2A2字段 List<WTPart> wtPartList = WTPartIBAQueryUtil.getWTPartsByIBA(物料描述, ibaValue); logger.info("查询到的物料参数为: " + wtPartList); //查询时排除当前part for (WTPart s : wtPartList) { String number = s.getNumber(); if (wtPartList.size() > 1 && !number.contains(partNum)) { throw new WTException("物料描述存在重复,请重新编辑后提交." + "当前部件与下列部件物料描述重复,编号为: " + number); } } }
第一种思路我们只能在修改时添加拼接
public class NewServiceListenerImpl extends StandardManager implements PartServiceListenerInterface, Serializable { private static final Logger logger = Logger.getLogger(NewServiceListenerImpl.class.getName()); private static final long serialVersionUID = 1L; private static final String CLASSNAME = NewServiceListenerImpl.class.getName(); @Override public String getConceptualClassname() { return CLASSNAME; } @Override protected synchronized void performStartupProcess() throws ManagerException { ServiceEventListenerAdapter listener = new AttributeRuleListenerImpl(getConceptualClassname()); // 保存 getManagerService().addEventListener(listener, PersistenceManagerEvent.generateEventKey(PersistenceManagerEvent.POST_STORE)); // 修改 getManagerService().addEventListener(listener, PersistenceManagerEvent.generateEventKey(PersistenceManagerEvent.POST_MODIFY)); // getManagerService().addEventListener(listener, // WorkInProgressServiceEvent.generateEventKey(WorkInProgressServiceEvent.POST_CHECKIN)); logger.debug("清除属性监听服务已结束---"); } static class AttributeRuleListenerImpl extends ServiceEventListenerAdapter { public AttributeRuleListenerImpl(String s) { super(s); } @Override public void notifyEvent(Object obj) { super.notifyEvent(obj); } @Override public void notifyVetoableEvent(Object obj) throws Exception { logger.debug("进入notifyVetoableEvent方法----->"); logger.debug("obj.class=" + obj.getClass()); // 获取当前触发的事件对象 KeyedEvent keyedevent = (KeyedEvent) obj; // 获取当前被操作的持久化对象,如部件,文档,容器等 Object target = keyedevent.getEventTarget(); //获取事件类型 String eventType = keyedevent.getEventType(); logger.debug("eventType......" + eventType); logger.debug("target.class....." + target.getClass()); if (eventType != null && eventType.equals(PersistenceManagerEvent.POST_MODIFY)) { //监听对象已被修改的事件,包含编辑、检出后编辑、部件结构中编辑、OOTB导入更新等部件修改后得拼接和检验 logger.debug("监听到POST_MODIFY-部件修改。。。"); if (target instanceof WTPart) { //获取最新版本部件会导致OOTB导入更新时进程错误 WTPart wtPart = (WTPart) target; String inName = PartUtil.getTypeInnerName(wtPart); if (!Const.EXT_MATERIAL_TYPE.contains(inName)) { logger.debug("部件被修改后后进行物料描述拼接"); 你新建的类 formProcessor = new 你新建的类(); formProcessor.setMaterialDesc(wtPart); IBAUtil ibaUtil = new IBAUtil(wtPart); // 校验物料描述是否重复 logger.debug("进行物料描述重复性校验"); iotCreatePartAndCADDocFormProcessor.checkIBAValue(wtPart, ibaUtil); } } } } } }

浙公网安备 33010602011771号