【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);
                    }
                }
            }
        }
    }
}
复制代码

 

posted @   tt1234  阅读(551)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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保姆级教程
点击右上角即可分享
微信分享提示