高度なカスタマイズ > ビジネスロジックのカスタマイズ > ワークフロー管理のカスタマイズ > 変更アクティビティのワークフロー割当のカスタマイズ
  
変更アクティビティのワークフロー割当のカスタマイズ
変更アクティビティのワークフローテンプレートをカスタマイズして、やり直しアクティビティを、単純にチーム全体に再割当するのではなく、元のアクティビティを実際に完了したユーザーに割り当てることができます。
Windchill の既成 (OOTB) の変更アクティビティのワークフローテンプレートは、元の割当を実際に完了したユーザーが誰であるかにかかわらず、"「タスク実施者」" 役割で指定されたすべてのユーザーに、やり直しアクティビティを割り当てます。これは一般の OOTB ワークフローテンプレートには適していますが、変更アクティビティをグループの人々に割り当て、グループ内の誰もがタスクを完了できるようにしている顧客のニーズは満たしていません。この場合は、元のタスクを実際に行った人にやり直しアクティビティを割り当てて、その人が素早く作業を修正できるようにします。元の作業に精通していない人がそれを担当することになる可能性があるため、やり直しアクティビティをグループ全体に割り当てることはしません。さらに、やり直しアクティビティに対する別のチーム役割 ("Rework Assignee" など) を使用することもできます。
* 
このプロセスは、変更管理オブジェクトおよびワークフローのカスタマイズのワークフロープロセスをよく理解していることを前提としています。このドキュメントで説明する方法は、変更管理オブジェクトのワークフローテンプレートに限定されます。
予測される結果
OOTB 変更アクティビティのワークフローテンプレートを使用して、変更タスクが 3 人の割り当てられた参加者によって作成された場合を想定します。変更タスクを最初に作成したときに、プロセスページには次のように表示されます。
ユーザー 2 が実際にタスクを実行して完了すると、「変更プロセス用タスク」テーブルが更新され、完了した作業タスクとレビュータスクが表示されます。
レビュー中に問題が見つかった場合、やり直しするためにタスクが送信され、元のタスク実施者ごとに新しいやり直しタスクが作成されます。このうちの誰かがやり直しタスクを受け入れます。
元のチームメンバー全員に対してやり直しタスクを作成すると、自社の標準変更プロセスに反して実行される可能性があります。たとえば、変更プロセスでは、その作業の元の実行者であるユーザー 2 に特別な "やり直し" 役割が割り当てられるように指示できます。さらに、やり直しタスクに割り当てられるのがユーザー 2 のみにします。目的のプロセスページは、次のように表示されます。OOTB 変更アクティビティのワークフローテンプレートの使用時は、プロセスを手動で編集しないとこれは可能になりません。この変更プロセスに自動的に従うためには、カスタマイズされたテンプレートが必要です。
ソリューション
変更アクティビティのワークフローテンプレートをカスタマイズして、作業タスクを完了した人を自動的に判別し、その人 (複数可) だけにやり直し役割を割り当てるようにします。
前提となる知識
この最良事例を適用するには、以下を理解しておく必要があります。
変更管理オブジェクトのワークフロープロセス
ワークフローテンプレートの管理とカスタマイズ
ライフサイクルテンプレートの管理とカスタマイズ
オブジェクト初期化規則の管理とカスタマイズ
列挙タイプのカスタマイズ
基本の Java プログラミング
カスタマイズポイント
カスタムのやり直し役割の作成
enumCustomize ツールを使用して、新しいやり直し役割を wt.project.RoleRB.rbInfo に追加します。このツールの使用の詳細については、Enumerated Type Customization Utilityを参照してください。
このプロセスでは、カスタム役割 "Rework Assignee" を使用します。新しい役割が必要ない場合、このステップはスキップできます。
変更アクティビティのワークフローのカスタマイズ
1. 「サイト」「組織」「製品」、または「ライブラリ」コンテキストの「ユーティリティ」ページで、「ワークフローテンプレート管理」を選択します。
2. "Change Activity Workflow" テンプレートに対して「複製」を選択して、カスタマイズのコピーを作成します。カスタマイズされたワークフローの適切な名前を選択します (たとえば、このドキュメントでは "Custom Change Activity Workflow" が使用されています)。ワークフローテンプレートを変更する前には常にコピーを行います。OOTB ワークフローテンプレートそのものをカスタマイズしないようにしてください。
3. "Custom Change Activity Workflow" テンプレートに対して「編集」操作を選択すると、ワークフローテンプレートエディタに変更アクティビティのワークフローグラフが表示されます。このカスタマイズに関係する領域は、右上部分にあるやり直しループです。
4. 「Rework Change Notice Task」をダブルクリックしてエディタを開き、「参加者」タブを選択します。Rework Assignee 役割を追加し、タスク実施者役割を除去します。新しい役割が必要ない場合、このステップはスキップできます。
5. ワークフローの「Set State Implementation」ステップと「Rework Change Notice Task」ステップの間に新規定義式のステップを作成し、Set Rework Assignee のような意味がわかる名前を付けます。
6. 前の作業タスクを完了したユーザーを自動的に取得し、それらのユーザーをやり直しタスクの変更アイテムチームに割り当てるために、Set Rework Assignee ステップに Java コードを追加します。ここで呼び出すことができるヘルパーメソッドについては、セクション「Java ヘルパーメソッド」を参照してください。
例:
wt.project.Role reworkRole = wt.project.Role.toRole("REWORK_ASSIGNEE");
wt.project.Role participantsRole = reworkRole;
java.util.Map<wt.project.Role, wt.fc.collections.WTSet> roleToParticipantMap;
// Try to get participants from the rework activity.
roleToParticipantMap = com.ptc.windchill.pdmlink.change.server.
impl.WorkflowProcessHelper.getActivityParticipants(
(wt.change2.VersionableChangeItem) primaryBusinessObject,
"Rework Change Notice Task");
// If the map is null then the rework activity has not executed yet.
if (roleToParticipantMap == null) {
participantsRole = wt.project.Role.toRole("ASSIGNEE");
// Try to get participants from the original activity.
roleToParticipantMap = com.ptc.windchill.pdmlink.change.server.impl.
WorkflowProcessHelper.getActivityParticipants(
(wt.change2.VersionableChangeItem) primaryBusinessObject,
"Complete Change Notice Task");
}
// Assign participants from original or rework activity to the
rework role on the change team.
// By doing so only those participants will get the next
rework tasks.
wt.fc.collections.WTSet participants = roleToParticipantMap.
get(participantsRole);
com.ptc.windchill.pdmlink.change.server.impl.WorkflowProcessHelper.
setChangeItemParticipants(
(wt.change2.VersionableChangeItem) primaryBusinessObject,
reworkRole, participants);
7. Java コードが完了した後、「構文チェック」ボタンを選択してエラーがないか確認します。カスタムワークフローテンプレートを使用する前に、すべてのエラーが修正されていることを確認してください。
8. "Custom Change Activity Workflow" テンプレートに対する変更を保存して、これをチェックインします。
変更アクティビティのライフサイクルのカスタマイズ
「ライフサイクルテンプレート管理」ユーティリティを使用して、カスタムの "「変更アクティビティのライフサイクル」" テンプレートを作成します。前のセクションで作成したカスタムワークフローテンプレートを指定します。
変更アクティビティのオブジェクト初期化規則のカスタマイズ
「オブジェクト初期化規則管理」ユーティリティを使用して、カスタムの "「変更アクティビティ」" のオブジェクト初期化規則 (OIR) をテンプレートを使用して作成します。前のセクションで作成したカスタムライフサイクルテンプレートを指定します。
Java ヘルパーメソッド
やり直しの割当を自動的に行うためのコードを簡素化するために、いくつかの Java ヘルパーメソッドが提供されています。これらのメソッドは次のクラスに配置されています。com.ptc.windchill.pdmlink.change.server.impl.WorkflowProcessHelper
ヘルパーメソッド getActivityParticipants
/**
* Get participants of a completed work activity for a change item.
* If the work activity was executed multiple times
* (e.g., a rework activity was run several times), then only
* the participants from the latest completed execution are returned.
*
* Supported API: true
*
* @param changeItem Work flow primary business object.
* @param activityName Work flow activity name.
*
* @return Map of activity roles to the participants for that role,
* or null if an activity with the specified name has not been
* executed for the change item.
*
* @throws WTException
*/
public static Map<Role, WTSet>
getActivityParticipants(VersionableChangeItem changeItem,
String activityName) throws WTException
ヘルパーメソッド getChangeItemParticipants
/**
* Get all participants of a change item team.
*
* Supported API: true
*
* @param changeItem Change item object.
*
* @return Map of change item roles to the
* participants for that role.
*
* @throws WTException
*/
public static Map<Role,WTSet> getChangeItemParticipants
(VersionableChangeItem changeItem)
throws WTException {
ヘルパーメソッド setChangeItemParticipants
/**
* Set the participants for a role of a change item team.
* The old participants of the role, if any, will be
* replaced with the new participants.
*
* Supported API: true
*
* @param changeItem Work flow primary business object.
* @param role Change item team role to be set.
*
* @param participants Collection of new participants for the role.
* Pass an empty set to remove all participants
* from the role. Pass null to remove the
* entire role.
* @throws WTException
*/
public static void setChangeItemParticipants(VersionableChangeItem changeItem,
Role role,
WTCollection participants) throws WTException {