Windchill开发-移除工作区模型

移除工作区模型

  • 一、应用场景
  • 二、相关代码
    • 2.1 查询模型
      • 2.1.1 方法一
      • 2.1.2 方法二
      • 2.1.3 区别
    • 2.2 查询模型所在工作区
    • 2.3 移除工作区的模型

一、应用场景

Windchill系统中,系统的模型数据和工作区中的模型数据并非是同一个数据,工作区在线时会自动把系统的数据与工作区做同步,也可以通过工作区的更新按钮,保持工作区数据与系统数据的一致性。但是在实际业务中,工作区缓存、数据存在于多工作区等情况都会影响到数据的同步效果,导致一些客制化功能异常。

二、相关代码

2.1 查询模型

2.1.1 方法一

public static EPMDocument getEPMDocument(String epmNumber) throws WTException {
        EPMDocument epm = null;
        if (StringUtils.hasText(epmNumber)) {
            QuerySpec querySpec = new QuerySpec(EPMDocument.class);
            SearchCondition sc =
                    new SearchCondition(EPMDocument.class, EPMDocument.NUMBER, SearchCondition.EQUAL, epmNumber);
            querySpec.appendWhere(sc);
            QueryResult queryResult = PersistenceHelper.manager.find(querySpec);
            LatestConfigSpec configSpec = new LatestConfigSpec();
            queryResult = configSpec.process(queryResult);
            if (queryResult.size() > 0) {
                epm = (EPMDocument) queryResult.nextElement();
            }
        }
        return epm;
    }

2.1.2 方法二

public static EPMDocument getEPMDocument(String epmNumber) throws WTException {
        EPMDocument epm = null;
        if (StringUtils.hasText(epmNumber)) {
            QuerySpec querySpec = new QuerySpec(EPMDocument.class);
            querySpec.appendWhere(new SearchCondition(EPMDocument.class, "master>number", SearchCondition.EQUAL, epmNumber.toUpperCase(), false), new int[]{0});
            querySpec.appendAnd();
            querySpec.appendWhere(new SearchCondition(EPMDocument.class, "iterationInfo.latest", SearchCondition.IS_TRUE), new int[]{0});
            querySpec.appendOrderBy(new OrderBy(new ClassAttribute(EPMDocument.class, "versionInfo.identifier.versionSortId"), true), new int[]{0});
            QueryResult queryResult = PersistenceServerHelper.manager.query(querySpec);
            while (queryResult.hasMoreElements()) {
                epm = (EPMDocument) queryResult.nextElement();
                break;
            }
        }
        return epm;
    }

2.1.3 区别

方法一:通过标准的API对查询结果进行筛选,获取到最新的数据;
方法二:通过小版本是否最新的判定字段LATESTITERATIONINFO,以及大版本的排序字段VERSIONSORTIDA2VERSIONINFO进行筛选的;
如果模型X是A.3版本,被Y、Z两个用户检入到工作区,Z用户工作区离线不再对数据进行操作,Y用户修改完模型把数据检入到系统。此时如果通过方法一查询,可以得到最新的A.4版本,通过方法二查询,就可能得到A.3版本,因为此时的QueryResult结果集中有两条数据,即Z工作区的A.3版本数据和系统的A.4版本。
通过以上分析可以看出,方法二获取到的数据可能对业务产生负面的效果,但是如果一直不处理Z工作区中的数据,模型X经过几个版本的迭代之后再登陆Z用户的工作区时,A.3版本的数据可能无法进行更新和移除了,只能使用管理员的账号删除该工作区,所以查询到工作区的数据也并非坏事,可以提前作出预警,让用户从工作区移除,或者客制化代码功能自动去移除。

2.2 查询模型所在工作区

import org.springframework.util.StringUtils;
import wt.epm.EPMDocument;
import wt.epm.workspaces.EPMWorkspace;
import wt.epm.workspaces.EPMWorkspaceHelper;
import wt.fc.PersistenceHelper;
import wt.fc.PersistenceServerHelper;
import wt.fc.QueryResult;
import wt.fc.collections.WTArrayList;
import wt.fc.collections.WTCollection;
import wt.fc.collections.WTSet;
import wt.inf.container.WTContainerHelper;
import wt.inf.container.WTContainerRef;
import wt.method.MethodContext;
import wt.org.OrganizationServicesHelper;
import wt.org.WTUser;
import wt.pom.WTConnection;
import wt.query.ClassAttribute;
import wt.query.OrderBy;
import wt.query.QuerySpec;
import wt.query.SearchCondition;
import wt.util.WTException;
import wt.vc.config.LatestConfigSpec;
import wt.vc.wip.WorkInProgressHelper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test {

    public static Set<String> getWorkSpaceUserByEPMDocument(EPMDocument epm) throws Exception {
        Set<String> usernames = new HashSet<>();
        MethodContext methodcontext = MethodContext.getContext();
        WTConnection wtconnection = (WTConnection) methodcontext.getConnection();
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        String sql = "SELECT e2.DOCUMENTNUMBER ,w.NAME ,w.FULLNAME " +
                "FROM EPMDOCUMENT e ,EPMDOCUMENTMASTER e2 ,WTUSER w " +
                "WHERE e.IDA3MASTERREFERENCE = e2.IDA2A2 " +
                "AND e.STATECHECKOUTINFO = 'wrk-p' " +
                "AND e2.DOCUMENTNUMBER = ? " +
                "AND e.LATESTITERATIONINFO = 1 " +
                "AND e.VERSIONSORTIDA2VERSIONINFO IN ( " +
                "SELECT MAX(e3.VERSIONSORTIDA2VERSIONINFO) FROM EPMDOCUMENT e3 " +
                "WHERE e3.IDA3MASTERREFERENCE = e.IDA3MASTERREFERENCE " +
                ") " +
                "AND e.IDA3B2ITERATIONINFO = w.IDA2A2 ";
        try {
            Connection connection = wtconnection.getConnection();
            statement = connection.prepareStatement(sql);
            statement.setString(1, epm.getNumber());
            resultSet = statement.executeQuery();
            while (resultSet.next()) {
                usernames.add(resultSet.getString("NAME"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                wtconnection.freeStatement(sql, statement, true);
            }
            if (!wtconnection.isTransactionActive()) {
                MethodContext.getContext().freeConnection();
            }
        }
        return usernames;
    }

}

注意:该方法查询到的是模型所在所有工作区的用户名

2.3 移除工作区的模型

public static void removeFromWorkspace(EPMDocument epm) throws Exception {
        if (WorkInProgressHelper.isWorkingCopy(epm)) {
            Set<String> usernames = getWorkSpaceUserByEPMDocument(epm);
            WTCollection collection = new WTArrayList(1);
            collection.add(epm);
            WTContainerRef containerRef = WTContainerHelper.getContainerRef(epm);
            for (String username : usernames) {
                WTUser user = OrganizationServicesHelper.manager.getAuthenticatedUser(username);
                if (user != null){
                    WTSet workspaces = EPMWorkspaceHelper.manager.getWorkspaces(user, containerRef);
                    Iterator iterator = workspaces.iterator();
                    while (iterator.hasNext()) {
                        EPMWorkspace workspace = (EPMWorkspace) iterator.next();
                        EPMWorkspaceHelper.manager.removeFromWorkspace(workspace, collection);
                    }
                }
            }
        }
    }

你可能感兴趣的:(Windchill二开,java)