Пример обхода конфликтов бизнес-правил
Вы можете захотеть просмотреть некоторые или все сбои бизнес-правил, не запрещая продолжение или завершение рабочего процесса. Создайте два уникальных набора бизнес-правил. В одном правила являются обязательными для продолжения или завершения процесса, а в другом составляется отчет о сбоях правил, но не требуется завершать процесс. Наличие двух отдельных наборов бизнес-правил позволяет конфигурировать рабочий процесс для вызова любого из наборов правил в разных точках выполнения рабочего процесса.
В следующем примере показано, как конфигурировать набор правил, являющихся обязательными для продолжения, и второй набор правил, не являющихся обязательными для продолжения. Предположим, нужно проверить, что определенные атрибуты заполнены (в данном случае это Material). Если атрибут пустой, процесс продолжится, однако правило цели выпуска должно пройти проверку.
1. Создайте необязательный набор бизнес-правил для проверки атрибутов.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BusinessRuleSet SYSTEM "standardX20.dtd">
<BusinessRuleSet>
<ObjectID><localId>wt.businessRules.BusinessRuleSet:10001</localId>
</ObjectID>
<objectContainerPath>/wt.inf.container.OrgContainer=
Demo Organization/wt.pdmlink.PDMLinkProduct=Example1TestProduct
</objectContainerPath>
<key>EXAMPLE1_NON_REQUIRED_ATTRIBUTE_RULE_SET</key>
<name>EXAMPLE1_NON_REQUIRED_ATTRIBUTE_RULE_SET</name>
<description>EXAMPLE1_NON_REQUIRED_ATTRIBUTE_RULE_SET</description>
<enabled>true</enabled>
<overridable>true</overridable>
<updateIfExists>true</updateIfExists>
</BusinessRuleSet>
2. Создайте правило атрибута для атрибута Material.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BusinessRule SYSTEM "standardX20.dtd">
<BusinessRule>
<ObjectID><localId>wt.businessRules.BusinessRule:10002</localId>
</ObjectID>
<objectContainerPath>/wt.inf.container.OrgContainer=
Demo Organization/wt.pdmlink.PDMLinkProduct=Example1TestProduct
</objectContainerPath>
<key>EXAMPLE1_ATTRIBUTE_RULE</key>
<selector>ATTRIBUTE_RULE</selector>
<name>Example 1 Attribute Rule</name>
<description>Example 1 Attribute Rule</description>
<enabled>true</enabled>
<updateIfExists>true</updateIfExists>
<configs>
<config name="objectType" value="com.ptc.Part"></config>
<config name="Material" value="SET"></config>
</configs>
</BusinessRule>
3. Создайте связь для правила атрибута и необязательного набора правил.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BusinessRule SYSTEM "standardX20.dtd">
<BusinessRuleLink>
<ObjectID><localId>wt.businessRules.BusinessRuleLink:10003</localId>
</ObjectID>
<ruleSet><ObjectReference><localId>wt.businessRules.BusinessRuleSet:10001
</localId></ObjectReference></ruleSet>
<rule><ObjectReference><localId>wt.businessRules.BusinessRule:10002
</localId></ObjectReference></rule>
<blockNumber>1</blockNumber>
<updateIfExists>true</updateIfExists>
</BusinessRuleLink>
4. Создайте обязательный набор бизнес-правил для правила цели выпуска.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BusinessRuleSet SYSTEM "standardX20.dtd">
<BusinessRuleSet>
<ObjectID><localId>wt.businessRules.BusinessRuleSet:20001</localId>
</ObjectID>
<objectContainerPath>/wt.inf.container.OrgContainer=Demo Organization
/wt.pdmlink.PDMLinkProduct=Example1TestProduct</objectContainerPath>
<key>EXAMPLE1_RELEASE_RULE_SET</key>
<name>Example1_ReleaseRuleSet</name>
<enabled>true</enabled>
<description>Example1_ReleaseRuleSet</description>
<overridable>true</overridable>
<updateIfExists>true</updateIfExists>
</BusinessRuleSet>
5. Перезагрузите правило цели выпуска для сайта.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BusinessRule SYSTEM "standardX20.dtd">
<BusinessRule>
<ObjectID><localId>wt.businessRules.BusinessRule:20002</localId>
</ObjectID>
<key>RELEASE_TARGET</key>
<selector>RELEASE_TARGET</selector>
<name>com.ptc.windchill.enterprise.change2.change2ClientResource:
RELEASE_TARGET_RULE_NAME</name>
<description>com.ptc.windchill.enterprise.change2.
change2ClientResource:RELEASE_TARGET_RULE_DESC</description>
<enabled>true</enabled>
<updateIfExists>true</updateIfExists>
</BusinessRule>
6. Создайте связь для правила цели и обязательного набора правил.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE BusinessRuleLink SYSTEM "standardX20.dtd">
<BusinessRuleLink>
<ObjectID><localId>wt.businessRules.BusinessRuleLink:20003</localId>
</ObjectID>
<ruleSet><ObjectReference><localId>wt.businessRules.BusinessRuleSet:
20001</localId></ObjectReference></ruleSet>
<rule><ObjectReference><localId>wt.businessRules.BusinessRule:20002
</localId></ObjectReference></rule>
<blockNumber>1</blockNumber>
<updateIfExists>true</updateIfExists>
</BusinessRuleLink>
7. Выполните все обязательные и необязательные наборы бизнес-правил. Для отображения всех конфликтов обязательных и необязательных правил измените условный оператор задания рабочего процесса Аудит извещений об изменениях, чтобы использовать оба набора правил: EXAMPLE1_RELEASE_RULE_SET и EXAMPLE1_NON_REQUIRED_ATTRIBUTE_RULE_SET.
if (wt.change2.ChangeHelper2.isTrackingChange((wt.inf.container.
WTContained)primaryBusinessObject)) {
result = "Revisioning Enabled";
}else {
result = "Revisioning Disabled";
com.ptc.core.businessRules.engine.BusinessRuleSetBean[] beans = new
com.ptc.core.businessRules.engine.BusinessRuleSetBean[] {
// Configure to call non-required rule set
com.ptc.core.businessRules.engine.BusinessRuleSetBean.newBusinessRuleSetBean
("EXAMPLE1_NON_REQUIRED_ATTRIBUTE_RULE_SET", "wt.change2.ChangeRecord2"),
// Configure to call required rule set
com.ptc.core.businessRules.engine.BusinessRuleSetBean.newBusinessRuleSetBean
("EXAMPLE1_RELEASE_RULE_SET", "wt.change2.ChangeRecord2")
};
}
com.ptc.core.businessRules.validation.RuleValidationResultSet resultSet =
wt.businessRules.BusinessRulesHelper.engine.execute(primaryBusinessObject, beans);
if ( resultSet.hasResultsByStatus(com.ptc.core.businessRules.validation.
RuleValidationStatus.FAILURE)) {
businessRulesResultSetGlobal = wt.businessRules.BusinessRulesHelper.
serialize(resultSet);
preReleaseConflictsMsg = new wt.util.WTMessage("com.ptc.windchill.
enterprise.change2.change2ClientResource", com.ptc.windchill.enterprise.
change2.change2ClientResource.BUSINESS_RULES_PRERELEASE_VALIDATION_MSG,
null).getLocalizedMessage();
preReleaseConflictsMsg = preReleaseConflictsMsg + "\n" + resultSet.
getFailedRulesMessage(java.util.Locale.getDefault());
}
8. Выполните обязательные наборы бизнес-правил. Чтобы запретить продолжение рабочего процесса извещения об изменении для обязательных бизнес-правил, измените условный оператор, чтобы использовать только обязательный набор правил EXAMPLE1_RELEASE_RULE_SET для задания рабочего процесса Resolve Release Conflicts (Разрешение конфликтов выпуска).
result = "NOT_READY";
com.ptc.core.businessRules.engine.BusinessRuleSetBean[] beans = new
com.ptc.core.businessRules.engine.BusinessRuleSetBean[] {
// Configure to call required rule set only
com.ptc.core.businessRules.engine.BusinessRuleSetBean.
newBusinessRuleSetBean("EXAMPLE1_RELEASE_RULE_SET",
"wt.change2.ChangeRecord2")
};
com.ptc.core.businessRules.validation.RuleValidationResultSet
resultSet = wt.businessRules.BusinessRulesHelper.engine.execute
(primaryBusinessObject, beans);
if ( !resultSet.hasResultsByStatus(com.ptc.core.businessRules.
validation.RuleValidationStatus.FAILURE)) {
result = "PROCEED";
} else {
businessRulesResultSetGlobal = wt.businessRules.BusinessRulesHelper.
serialize(resultSet);
preReleaseConflictsMsg = new wt.util.WTMessage("com.ptc.windchill.
enterprise.change2.change2ClientResource", com.ptc.windchill.enterprise.
change2.change2ClientResource.BUSINESS_RULES_PRERELEASE_VALIDATION_MSG,
null).getLocalizedMessage();
preReleaseConflictsMsg = preReleaseConflictsMsg + "\n" + resultSet.
getFailedRulesMessage(java.util.Locale.getDefault());
}
Будет происходить регенерация задания рабочего процесса Разрешение конфликтов выпуска, пока все конфликты не будут разрешены.