意思決定支援システム「DecisionFlow」を(趣味で)作った
組織で「申請・承認」のプロセスがメールや口頭に散らばり、判断が滞ったり、なぜそう判断したのかが後から追えなくなることはないでしょうか。
この記事では、Dataverse / Power Apps Code Apps / Power Automate / AI Builder / Copilot Studio を組み合わせて、意思決定を一元管理するシステム DecisionFlow を構築した記録をまとめます。
"組織で"とか書いてますがあくまで趣味で作ってます
GitHub Copilot × Power Platformで爆速開発
要件定義から完成まで2日!本プロジェクトは、geekfujiwara 氏が公開されている Power Platform コードファースト開発の知見を土台に構築しています。
-
CodeAppsDevelopmentStandard
本リポジトリのクローン元。デプロイスクリプト・Dataverse 連携パターン・開発標準の大部分はここから学び、agent.mdやskills/を拡張して活用させていただきました。 -
CodeAppsStarter
Code Apps の UI コンポーネント構成・shadcn/ui 活用パターンの設計参考にさせていただきました。
開発全体を GitHub Copilot(主に Copilot Chat / Agent モード)で補助しながら進めました。具体的な活用箇所は以下の通りです。
-
Dataverse セットアップスクリプト: テーブル・リレーション・Choice 定義・マスタ投入を一括で行う Python スクリプトを Copilot Agent と対話しながら設計・実装。
dataverse/SKILL.mdに API パターンとハマりポイントを蓄積したことで、後続のスクリプト修正が加速した -
Power Automate デプロイスクリプト: フローの JSON 構造生成、Dataverse Web API 呼び出し、接続参照の動的解決などを補完。
power-automate/SKILL.mdにフロー定義の構造を文書化しておくことで、Copilot が正しい JSON を出力できるようになった -
Code Apps の UI 実装: TanStack React Query のパターン、shadcn/ui コンポーネントの組み合わせ、型定義の整備を加速。
code-apps/SKILL.mdに Code SDK 固有のパターンとデプロイコマンドを集約した - ドキュメント整備: ARCHITECTURE.md / PLAN.md の設計ドキュメントも Copilot と対話しながら作成。設計の意図・制約・完了条件を先に文書化してから実装に入るサイクルが機能した
解決したかった課題
| ステークホルダー | 課題 |
|---|---|
| 申請者 | 入力フォーマットが統一されていない / 案件が停滞しても気づけない / 判断理由が不透明 |
| 判断者 | 申請の読み解きに時間がかかる / 過去判断と一貫性を取りにくい / 案件が属人化し負荷が偏る |
| 両者共通 | 関係者を巻き込んだ会話がメール・チャットに散在し、後から追えない |
これらをまとめて解決するために、Power Platform のコンポーネントを組み合わせた統合プラットフォームを設計しました。
アーキテクチャ概要
各コンポーネントの役割はシンプルに分けています。
| コンポーネント | 役割 | 採用理由 |
|---|---|---|
| Dataverse | 申請・会話・判断・関係者の一元管理 | 行レベルセキュリティ・監査ログが必須 |
| Code Apps | カスタムUI(TypeScript + React) | 判断キュー・スレッドUI・チャートなどカスタムビジュアルが必要 |
| Power Automate | イベント駆動の通知・リマインド・AI判断生成 | 確定的フロー処理に最適 |
| AI Builder |
DecisionRecommendation プロンプト |
フローから再利用 + 構造化JSON出力 |
| Copilot Studio | DecisionFlow Assistant | 判断待ち一覧・類似案件・推奨判断をチャットで照会 |
データモデル
Dataverse のテーブル設計は以下の通りです。
| テーブル | 説明 |
|---|---|
ds_application |
申請。ステージ(下書き/提出済み/判断済み)・AI判断結果列を持つ |
ds_message |
スレッド型の会話。Comment / Question / Answer / System の種別 |
ds_mention |
メッセージへの @メンション。既読フラグ付き |
ds_participant |
申請への関係者。Applicant / Decider / CoDecider / Contributor / Observer |
ds_decision |
判断結果(承認・却下・差し戻し)と理由 |
ds_category |
申請カテゴリ(顧客案件・部内案件 など)と推奨フォーマット |
ds_decisionoption |
判断選択肢マスタ |
ds_applicationresource |
申請に紐づく関連リンク |
セキュリティ設計
-
ds_Applicant/ds_Decider/ds_Adminの3ロールを作成 - 判断者は M365 グループ
DecisionFlow-Decidersを Dataverse グループチームに紐付け、ds_Deciderロールを一括付与 - 申請者の閲覧範囲は 自分の申請のみ。関係者に追加されると Power Automate で共有制御フローが走り、対象申請の閲覧権限が動的に付与・剥奪される
この「ロール(全体閲覧権)× テーブル行レベルセキュリティ(参加者)」のハイブリッド設計が、スコープを絞りながら柔軟に関係者を巻き込むポイントです。
Code Apps(フロントエンド)
技術スタックは以下です。
- TypeScript + React + Vite
- Tailwind CSS + shadcn/ui
- TanStack React Query
- Power Apps Code SDK(Dataverse 接続)
画面構成
| 画面 | 主なユーザー | 主要機能 |
|---|---|---|
| ダッシュボード | 全員・管理者 | ステージ分布、カテゴリ別件数、判断者別負荷グラフ |
| 申請リスト | 申請者 | 自分の申請を作成・確認。ステージ/カテゴリフィルタ |
| 判断キュー | 判断者 | 自分が判断者の申請を確認 |
| 申請詳細 | 全員 | 会話・関連資料・関係者・AI判断・判断入力をまとめて操作 |
| メンション | 全員 | 自分宛メンションの既読/未読管理 |
| 関連資料 | 申請者・判断者 | 申請横断での関連リンク確認・追加・削除 |
| マスタ管理 | 管理者 | カテゴリ・判断選択肢の保守 |
ステージ操作ルール
ステージ遷移はシンプルに設計しました。
- 申請者が操作できるのは
Draft(下書き)とSubmitted(提出済み)のみ -
Submitted後は通常編集禁止。Draftへの差し戻しのみ許可 -
Decided(判断済み)は判断者が判断を確定したタイミングで自動設定 - 差し戻し(判断選択肢「差し戻し」)の場合は
Draftに戻し、申請者が修正・再提出できる - 過去の
ds_decisionは保持したまま新しい判断を追加できる
Power Automate フロー
全部で7本のフローを Python スクリプトで自動デプロイしています。
| フロー名 | トリガー | 処理 |
|---|---|---|
Application_OnSubmitted |
申請ステージが Submitted に変更 | 判断者へ Outlook / Teams 通知 |
Application_StalledReminder |
毎朝9時スケジュール | 提出から3営業日超過の申請について判断者へリマインド |
Decision_OnCreated |
判断レコード作成 | 申請者・関係者へ判断確定通知 |
Mention_OnCreated |
メンションレコード作成 | 対象ユーザーへメンション通知 |
Application_GenerateAiDecision |
申請提出時 / 手動更新 | AI Builder を呼び出して推奨判断を生成・保存 |
Participant_OnCreated_GrantAccess |
関係者レコード作成 | 対象ユーザーへ申請の閲覧権限を付与 |
Participant_PreDelete_RevokeAccess |
関係者削除前 | 対象ユーザーの申請閲覧権限を剥奪 |
通知フローはバックグラウンド実行のため Code Apps の add-flow は不要。アクセス制御フローと AI 判断フローは Code Apps から直接呼び出すため add-flow が必要です。
AI 機能
AI Builder: DecisionRecommendation
Application_GenerateAiDecision フローから呼び出す AI プロンプトです。
入力として渡す情報:
- 申請タイトル・本文
- カテゴリの推奨フォーマット
- 過去の類似申請と判断結果
- 会話スレッド(存在する分のみ)
出力(構造化 JSON):
- 申請概要
- 会話概要
- 推奨判断選択肢
- 判断コメントのたたき台
- リスク・懸念事項
- 類似案件情報
申請詳細画面の「判断タブ」に AI 判断カードとして表示し、判断者が内容を確認しながら判断を記入できます。
Copilot Studio: DecisionFlow Assistant
生成オーケストレーションモードで構築した Copilot Studio エージェントです。
- Dataverse ナレッジを参照して申請状況をチャットで照会できる
- 類似案件の検索や推奨判断のたたき台をエージェントが提示
- Teams チャネルおよび M365 Copilot から利用可能
- 通知メール内に「エージェントに相談する」リンクを埋め込み、判断者が素早く相談できる
まとめ
Power Platform のコンポーネントをそれぞれの強みに応じて役割分担することで、コードファーストの開発体験を維持しながら、エンタープライズ向けの意思決定支援基盤を構築できました。
- Dataverse: 行レベルセキュリティと監査が必要なデータの保管先として最適
- Code Apps: React + TypeScript でカスタムUIを作れるため、ローコードの制限を超えた表現が可能
- Power Automate: イベント駆動の確定的処理に集中させ、AIには判断補助に特化させる役割分担が機能した
- AI Builder + Copilot Studio: 判断者の負荷軽減と、エージェントによる対話型照会は相性が良い
これをIT部門に作ってと相談したらスタートまでに半年、完成&改修で半年は固い。。。