高度なカスタマイズ > ビジネスロジックのカスタマイズ > Windchill ProjectLink のカスタマイズ > 期限の自動計算の設定 > サマリーアクティビティに使用する期限アルゴリズムの作成
  
サマリーアクティビティに使用する期限アルゴリズムの作成
サマリーアクティビティの期限のロールアップ方法を指定するカスタムアルゴリズムを作成するには、以下のステップを実行します。
開始する前に:
期限モードの設定で作成したアクティビティサブタイプの内部名が必要になります。
登録済みのイベントリスナーを確認します: 期限と進行状況の計算に登録されているイベントリスナー
サポートされている API を確認します: アクティビティ計算でサポートされる API
カスタムハンドラのガイドラインを確認します: 進行状況と期限の計算に使用するカスタムハンドラのガイドライン
ステップ 1: ハンドラクラスの作成
EPPSummaryDeadlineHandler インタフェースを使用することでカスタム計算アルゴリズムを作成できます。
EPPSummaryDeadlineHandler.java
calculateDeadlineForSummaryActivities(ArrayList<PlanActivity> summaryActivities, event);
カスタムアルゴリズムを利用するため、このインタフェースを拡張して特定の API をオーバーライドできます。たとえば、以下のサンプルコードでは、子アクティビティのうちの最も遅い期限に基づいてサマリーアクティビティの期限がロールアップされます。
package com.ptc.projectmanagement.plan.EPPSummaryDeadlineHandler;
public class CustomDeadlineRollUpImplementation implements EPPSummaryDeadlineHandler {
@Override
public void calculateDeadlineForSummaryActivities(ArrayList<PlanActivity> activitiesCollection, Object event)
throws WTException, WTPropertyVetoException {
try{
WTCollection summaryActivities = new WTArrayList(activitiesCollection);
summaryActivities = CollectionsHelper.manager.refresh(summaryActivities);
for (Object activity: summaryActivities){
Timestamp max = null;
if(activity instanceof PlanActivity){
PlanActivity planActivity = (PlanActivity)activity;
if (planActivity.isSummary()) {
WTCollection childCollection = PlannableHelper.service.getAllChildren(planActivity);
Iterator<PlanActivity> itr = childCollection.persistableIterator();
while (itr.hasNext()) {
PlanActivity act = itr.next();
if(max == null && act.getDeadline() != null)
max = act.getDeadline();
else if (max != null && act.getDeadline() != null
&& max.before(act.getDeadline()))
max = act.getDeadline();
}
}
planActivity.setDeadline(max);
activities.add(planActivity);
}
}
PersistenceHelper.manager.save(activities);
} catch(Exception ae){
ae.printStackTrace();
}
}
}
ステップ 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.EPPSummaryDeadlineHandler">
<Option cardinality="singleton" requestor= "null"
selector = "<タイプの内部名>"
serviceClass="<ハンドラクラスの完全修飾名>"/>
</Service>
たとえば、上記のサンプルハンドラクラスと内部名 "org.rnd.Custom_Engineering_Activity" を使用する場合、以下のようになります。
<Service context="default" name="com.ptc.projectmanagement.plan.EPPSummaryDeadlineHandler">
<Option cardinality="singleton" requestor= "null"
selector = "org.rnd.Custom_Engineering_Activity"
serviceClass="com.ptc.projectmanagement.plan.CustomDeadlineRollUpImplementation"/>
</Service>
4. Windchill シェルから次のコマンドを実行します。
xconfmanager -p
* 
PlanActivity タイプには以下のような既成のハンドラが定義されています。このハンドラは、クリティカルパスにある子アクティビティの期限をロールアップします。
<Service context="default" name="com.ptc.projectmanagement.plan.EPPSummaryDeadlineHandler">
<Option cardinality="singleton" requestor= "null"
selector = "com.ptc.projectmanagement.plan.PlanActivity"
serviceClass="com.ptc.projectmanagement.plan.PlanSummaryActivityDeadlineHandler"/>
</Service>