1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/happy0232-windchill955

Клонировать/Скачать
README.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 27.06.2025 21:29 192da68

windchill955

Введение

Библиотека windchill

QsHelper

Обертка для выполнения сложных запросов в Windchill, упрощающая написание сложных запросов

Важно отметить, что имена столбцов соответствуют непосредственно столбцам базы данных, а не атрибутам класса;

Примеры методов экземпляра

// Ниже приведен пример запроса по номеру, имени представления и поиску последней версии детали

// Здесь передается основной класс
QsHelper qs = new QsHelper(WTPart.class);

// Если необходимо выполнить запрос к другим таблицам, можно написать так, конечно, затем следует учитывать условия соединения
// qs.appendClassList(WTPartMaster.class, true);

// Запрос последней версии,
// Обратите внимание, что первый метод — это equal, без начала с and, методы, начинающиеся с and, автоматически добавляют соединитель AND, методы, начинающиеся с or, автоматически добавляют соединитель OR
// Также существуют отдельные методы qs.or() и qs.and()
qs.equal(WTPart.class, "LATESTITERATIONINFO", 1);

// Соединение с мастер-деталью, здесь используется andEqual, то есть добавляется соединитель AND
qs.andEqual(WTPart.class, "IDA3MASTERREFERENCE", WTPartMaster.class, "IDA2A2");

// Соединение с представлением
qs.andEqual(WTPart.class, "IDA3VIEW", View.class, "IDA2A2");

// Фильтрация по номеру
qs.andEqual("WTPARTNUMBER", "<номер детали>");

// Фильтрация по имени представления
qs.andEqual(View.class, "NAME", "<представление детали>");

// Получение рабочей копии для версии, проверенной на вход или выход
qs.andIn(WTPart.class, "STATECHECKOUTINFO", new String[]{"c/i", "wrk"});

// Пример условия IBA, реализованное через подзапрос qs.andEqualIBA("<имя IBA-атрибута>", "<значение IBA-атрибута>");

// Сортировка по времени создания qs.orderBy(WTPart.class, "CREATESTAMPA2", false);

// Если результат запроса — один объект (или требуется получить только один объект), можно написать так WTPart part = qs.findObject(WTPart.class);

// Если результат запроса — несколько объектов, можно написать так // findLatestList фильтрует результаты запроса и возвращает последнюю версию List parts = qs.findLatestList(WTPart.class);

// Если результат запроса сложный и не удовлетворяет требованиям, можно получить исходный QueryResult и обработать его самостоятельно QueryResult qr = qs.find();

// Получение SQL String sql = qs.toString();

// Если существующие методы не удовлетворяют требованиям, можно получить исходный QuerySpec и продолжить добавление условий или результатов запроса в соответствии с исходным способом QuerySpec querySpec = qs.getQs();


### Примеры статических методов

```java
// Поиск Master по номеру детали
WTPartMaster master = QsHelper.findObjectBy(WTPartMaster.class, "WTPartNumber", "<номер детали>");

// Поиск коллекции Master по имени детали
List<WTPartMaster> masters = QsHelper.findListBy(WTPartMaster.class, "NAME", "<имя детали>");
// Поиск количества Master по названию детали
int count = QsHelper.countBy(WTPartMaster.class, "NAME", "<название детали>");

// Поиск по IBA
List<WTPart> parts = QsHelper.findListByIBA(WTPart.class, "<имя IBA-свойства>", "<значение IBA-свойства>");

VersionedExtRecordHelper

Класс-помощник для версионных расширенных объектов

На основе принципа, что расширенные объекты автоматически следуют за основным объектом при его версировании, версионные свойства расширенных объектов записываются в мягкие свойства для управления версиями.

Преимущества: Управление версиями можно реализовать даже без использования слушателей.

Недостатки: Логика реализации достаточно сложная, существуют некоторые ограничения, например, при копировании и сохранении основного объекта могут возникнуть проблемы, требующие дополнительной обработки.

Способ использования

Для использования необходимо унаследовать класс VersionedExtRecordHelper.

Примеры методов

Приведенный ниже код демонстрирует пользовательский объект для формирования шаблонов: BOPMachiningParameter, и класс-помощник для установления версионной связи с операциями.

package ext.app.process.service;

import com.ptc.windchill.mpml.processplan.operation.MPMOperation;
import ext.app.process.constant.AttributeConstants;
import ext.app.process.framework.annotation.CPService;
import ext.app.process.helper.VersionedExtRecordHelper;
import ext.app.process.model.BOPMachiningParameter;
import wt.util.WTException;
import wt.util.WTPropertyVetoException;

import java.util.*;

/**
 * Класс-помощник для параметров обработки
 *
 * @author pyk13
 */
@CPService
public class MachiningParameterService extends VersionedExtRecordHelper<BOPMachiningParameter, MPMOperation> {

    public MachiningParameterService() {
        super(BOPMachiningParameter.class, MPMOperation.class);
    }

    @Override
    protected String versionIdFieldName() {
        return AttributeConstants.IBA_MACHINING_PARAMETER_VERSION;
    }

    @Override
    protected void updateExtRecord(BOPMachiningParameter machiningParameter, Map<String, String> extValues) throws WTException {
        try {
            machiningParameter.setSortNumber(extValues.getOrDefault("SortNumber", "0"));
            machiningParameter.setContent(extValues.getOrDefault("Content", ""));
            machiningParameter.setCuttingDepth(extValues.getOrDefault("CuttingDepth", ""));
            machiningParameter.setSpeed(extValues.getOrDefault("Speed", ""));
            machiningParameter.setFeedRate(extValues.getOrDefault("FeedRate", ""));
        } catch (WTPropertyVetoException e) {
            throw new WTException(e);
        }
    }

    @Override
    protected BOPMachiningParameter createExtRecord(Map<String, String> extValues, String mainOid, String versionId) throws WTException {
        BOPMachiningParameter machiningParameter = BOPMachiningParameter.newBOPMachiningParameter();

        try {
            machiningParameter.setRelatedObjOid(mainOid);
            machiningParameter.setMachiningParameterVersion(versionId);

            updateExtRecord(machiningParameter, extValues);
        } catch (WTPropertyVetoException e) {
            throw new WTException(e);
        }

        return machiningParameter;
    }

    @Override
    protected BOPMachiningParameter cloneExtRecord(BOPMachiningParameter oldMachiningParameter, String mainOid, String versionId) throws WTException {
        BOPMachiningParameter machiningParameter = BOPMachiningParameter.newBOPMachiningParameter();

        try {
            machiningParameter.setRelatedObjOid(mainOid);
            machiningParameter.setMachiningParameterVersion(versionId);

            machiningParameter.setSortNumber(oldMachiningParameter.getSortNumber());
            machiningParameter.setContent(oldMachiningParameter.getContent());
            machiningParameter.setCuttingDepth(oldMachiningParameter.getCuttingDepth());
            machiningParameter.setSpeed(oldMachiningParameter.getSpeed());
            machiningParameter.setFeedRate(oldMachiningParameter.getFeedRate());
        } catch (WTPropertyVetoException e) {
            throw new WTException(e);
        }

        return machiningParameter;
    }
}

PlanNodeHelper

Заключает методы для получения связанных узлов технологического маршрута. Преимущества: при обходе дочерних объектов одновременно записываются уровни узлов и связанные объекты, что удобно для последующего использования.

Пример - итерация по технологическому маршруту

MPMProcessPlan plan = (MPMProcessPlan) ToolUtils.getObjectByOid(oid);
MPMNode planNode = new MPMNode(plan);

PlanNodeHelper planNodeHelper = new PlanNodeHelper();

Map<String, String> numberPathMap = new HashMap<>();
planNodeHelper.iterate(planNode, node -> {
    MPMNode.NodeData nodeData = node.getNodeData();
    numberPathMap.put(nodeData.getNumber(), nodeData.getNumberPath());
});

Получение дочерних узлов операций

MPMNode parentNode = new MPMNode(parent);
PlanNodeHelper planNodeHelper = new PlanNodeHelper();
List<MPMNode> opNodes = planNodeHelper.iterateNextOp(parentNode);

PartNodeHelper

Оборачивает методы получения узлов, связанных с BOM, аналогично PlanNodeHelper. Преимущества: при обходе дочерних объектов одновременно записываются уровни узлов и связанные объекты, что облегчает дальнейшее использование.

AttrValueReadHelper

Оборачивает методы получения базовых свойств обычных объектов.

SoftAttributeHelper

Оборачивает методы операций с обычными типами.

IBAUtils

Оборачивает методы обычных операций с IBA.

Пакетное получение IBA-свойств объектов

String[] linkAttrNames = new String[]{
        AttributeConstants.IBA_BLANKING_LENGTH,
        AttributeConstants.IBA_BLANKING_WIDTH,
        AttributeConstants.IBA_LENGTH_MARGIN,
        AttributeConstants.IBA_WIDTH_MARGIN,
        AttributeConstants.IBA_NUMBER_OF_BLANK,
        AttributeConstants.IBA_MATERIAL_SPEC,
        AttributeConstants.IBA_MATERIALUTILIZATIONRATE
};
String typename = TypeUtils.getTypeIdentifier(partUsageLinks.get(0));
Map<WTPartUsageLink, Map<String, Object>> objIBAValues = IBAUtils.batchRetrieveAttrs(typename, partUsageLinks, linkAttrNames);

Пакетное получение IBA-свойств объектов и преобразование их в строки

String typeName = TypeUtils.getTypeIdentifier(object);
Map<Persistable, Map<String, String>> partLinkIBAValues = IBAUtils.batchRetrieveStringAttrs(typeName, partUsageLinks, new String[]{
        AttributeConstants.IBA_SORTSTRING,
        AttributeConstants.IBA_MUTILSORTSTRING,
});

Пакетное обновление мягких атрибутов

// Обновление мягких атрибутов
IBAAttrHolderBean ibaBean = new IBAAttrHolderBean();
ibaBean.setAttrBeans(ibaAttrBeans);
ibaBean.setObject(holder);
IBAUtils.batchUpdateValues(Arrays.asList(ibaBean));

Пакетное обновление мягких атрибутов

String typeName = null;
List<Persistable> ibaHolders = new ArrayList<>();
for (Object obj : addLinks.persistableCollection()) {
    ibaHolders.add((Persistable) obj);
    if (typeName == null) {
        typeName = TypeUtils.getTypeIdentifier((WTObject) obj);
    }
}

// Отметка как вспомогательного материала
Map<String, Object> ibaValues = new HashMap<>();
ibaValues.put(AttributeConstants.IBA_PARTLINK_TYPE, AttributeConstants.PART_TYPE_ACCESSORY);

IBAUtils.batchUpdateValues(typeName, ibaHolders, ibaValues);

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/happy0232-windchill955.git
git@api.gitlife.ru:oschina-mirror/happy0232-windchill955.git
oschina-mirror
happy0232-windchill955
happy0232-windchill955
master