Библиотека windchill
Обертка для выполнения сложных запросов в 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.
Приведенный ниже код демонстрирует пользовательский объект для формирования шаблонов: 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;
}
}
Заключает методы для получения связанных узлов технологического маршрута. Преимущества: при обходе дочерних объектов одновременно записываются уровни узлов и связанные объекты, что удобно для последующего использования.
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);
Оборачивает методы получения узлов, связанных с BOM, аналогично PlanNodeHelper. Преимущества: при обходе дочерних объектов одновременно записываются уровни узлов и связанные объекты, что облегчает дальнейшее использование.
Оборачивает методы получения базовых свойств обычных объектов.
Оборачивает методы операций с обычными типами.
Оборачивает методы обычных операций с 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);
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 )