高度なカスタマイズ > ビジネスロジックのカスタマイズ > Windchill ProjectLink のカスタマイズ > 進行状況の自動計算の設定 > サマリーアクティビティに使用する進行状況アルゴリズムの作成
  
サマリーアクティビティに使用する進行状況アルゴリズムの作成
サマリーアクティビティの期限のロールアップ方法を指定するカスタムアルゴリズムを作成するには、以下のステップを実行します。
開始する前に:
進行状況モードの設定で作成したアクティビティサブタイプの内部名が必要になります。
登録済みのイベントリスナーを確認します: 期限と進行状況の計算に登録されているイベントリスナー
サポートされている API を確認します: アクティビティ計算でサポートされる API
カスタムハンドラのガイドラインを確認します: 進行状況と期限の計算に使用するカスタムハンドラのガイドライン
ステップ 1: ハンドラクラスの作成
HealthStatusRollupHandler インタフェースを使用することでカスタム計算アルゴリズムを作成できます。
HealthStatusRollupHandler.java
rollupHealthStatus(<サマリーアクティビティオブジェクト>, event);
カスタムアルゴリズムを利用するため、このインタフェースを拡張して特定の API をオーバーライドできます。たとえば、以下のサンプルコードでは、選択した子からその期間に基づいて進行状況がロールアップされます。

package com.ptc.projectmanagement.plan.HealthStatusRollupHandler;
public class SummaryRollupBasedonDurationOfChildren implements HealthStatusRollupHandler {
@Override
public void rollUpHealthStatus(Plannable plannable, Object event) throws WTException, WTPropertyVetoException {
if(plannable instanceof AbstractPlanActivity && plannable.isSummary()){
Duration baseDuration = Duration.newDuration();
baseDuration.setDurationFormat(DurationFormat.DAYS);
baseDuration.setMillis(DurationUtils.toMillis(3, DurationFormat.DAYS));
WTCollection children = PlannableHelper.service.getImmediateCriticalChildren(plannable);
WTArrayList eligibleChildren = new WTArrayList();
if(children.size()>0){
Iterator<Plannable> iter = children.persistableIterator();
while (iter.hasNext()) {
Plannable childPlannable = (Plannable) iter.next();
if(childPlannable.getDuration().getMillis()> baseDuration.getMillis()){
eligibleChildren.add(childPlannable);
}
}
HealthStatusType healthStatusType = PlannableUtils.getWorstHealthStatus(eligibleChildren);
plannable = (Plannable) PersistenceHelper.manager.refresh(plannable);
((AbstractPlanActivity)plannable).setHealthStatusType(healthStatusType);
plannable = (Plannable) PersistenceHelper.manager.save((Persistable) plannable);
}
}
}
}
ステップ 2: ハンドラクラスの設定
進行状況計算のカスタムアルゴリズムを作成した後は、これを projectmanagement.service.properties.xconf に追加する必要があります。
1. 進行状況モードの設定で作成したアクティビティサブタイプの内部名をコピーします。
2. 次の場所に移動します。
${WT_HOME}/Windchill/codebase/com/ptc/projectmanagement/projectmanagement.service.properties.xconf
3. 以下のエントリを編集して、そのアクティビティサブタイプの内部名とハンドラクラス名を追加します。
<Service context="default" name="com.ptc.projectmanagement.plan.HealthStatusRollupHandler">
<Option cardinality="singleton" requestor= "null"
selector = "<タイプの内部名>"
serviceClass="<ハンドラクラスの完全修飾名>"/>
</Service>
たとえば、上記のサンプルハンドラクラスと内部名 "org.rnd.Custom_Engineering_Activity" を使用する場合、以下のようになります。
<Service context="default" name="com.ptc.projectmanagement.plan.HealthStatusRollupHandler">
<Option cardinality="singleton" requestor= "null"
selector = "org.rnd.Custom_Engineering_Activity"
serviceClass="com.ptc.projectmanagement.plan.SummaryRollupBasedonDurationOfChildren"/>
</Service>
4. Windchill シェルから次のコマンドを実行します。
xconfmanager -p
* 
PlanActivity タイプには以下のような既成のハンドラが定義されています。このハンドラは、クリティカルパスにある子アクティビティから進行状況をロールアップします。
<Service context="default" name="com.ptc.projectmanagement.plan.HealthStatusRollupHandler">
<Option cardinality="singleton" requestor= "null"
selector = "com.ptc.projectmanagement.plan.PlanActivity"
serviceClass="com.ptc.projectmanagement.plan.PlanHealthStatusRollupHandler"/>
</Service>