【PLM实战】windchill开发之物料描述拼接
1.【PLM实战】windchill开发之物料描述拼接
一、需求描述
物料描述拼接规则:由每个物料类型的各个属性进行拼接组成,用户可以根据需求,自定义拼接规则的调整
创建部件点击“完成”按钮时,
l 如果物料描述超过40字符,弹窗提示用户,但不阻止部件的创建
l 进行物料描述重复性检查,如果系统中有与当前物料描述相同的物料,提示用户,并列出重复的物料编号和描述,并阻止部件的创建。
二、开发思路
第一种:通过监听器,监听物料操作新增或者修改时进行拼接操作
第二种:通过继承CreatePartAndCADDocFormProcessor,在提交变更时进行拼接操作
由于监听器的触发是在物料生成编号前,所以创建物料时不能使用监听器操作
三、代码示例
第二种思路:创建一个class继承CreatePartAndCADDocFormProcessor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @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页面配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 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); } } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程