新プロジェクトルール(Data Table最小限・Code集約)に合わせ、旧19ノード版 (個別キーごとのData Table Get×7、HTTP Requestノード×6)を廃止。 設定値一括取得→Pleasanter照会・選択肢組み立て→JWTクレーム組み立て→ Sign JWT→アクセストークン取得・LINEWORKS送信→状態更新の7ノードに集約。 デプロイは行わず、ローカルJSON作成・検証のみ(コントローラーが同一ID XRqcykbG2LuAjGG2へPUTする想定)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| scripts | ||
| src/lib | ||
| test | ||
| workflows | ||
| .gitignore | ||
| package.json | ||
| README.md | ||
healthcheck-survey-bot
健康診断管理(SiteId 508971)×LINEWORKS Bot連携。508971のSiteSettings.Processes
をフロー定義として使い、n8n上でBot対話型のStatus管理を行う。
設計書: NodeSrv/docs/superpowers/specs/2026-09-05-healthcheck-lineworks-survey-n8n-design.md
実装計画: NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md
実機調査メモ(2026-09-05確認)
508971への新規テストProcess追加なしで、既存本番プロジェクト「実行予算WF申請」(SiteId 376872)の
取得済みprocesses.json(Pleasanter/実行予算WF申請/configs/production/site-376872_実行予算WF申請/processes.json)
に入力検証タブを使ったProcessの実例があり、そこからJSON構造を確認できた。
Processの入力検証タブはSiteSettings.Processes[].ValidateInputs配列として保存される。
各要素は{"Id": number, "ColumnName": string, "Required": boolean}(実例: {"Id": 1, "ColumnName": "Class021", "Required": true})。
配列名はValidationsではなくValidateInputs。値を設定していない項目(クライアント/サーバ正規表現、エラーメッセージ、最小/最大等)は
キー自体が省略される可能性が高い(今回の実例では未設定のため確認できていない)。
Task 5(processFlow.js)のgetValidationColumnNamesはこの構造(process.ValidateInputs[].ColumnName)を前提に実装する。
n8nリソースID一覧
(Task 8〜11完了後、ここに作成したData Table ID・ワークフローIDを記録する)
-
Data Table
healthcheck_bot_state:jqMDa2YZTI4f0iQ7- projectId:
LOcxF69Gm4PvnkqA(org-master-sync用プロジェクトを流用) - 列:
resultId,targetEmail,currentStatus,pendingProcesses,awaitInput,awaitProcessId,awaitColumn(すべてstring型) - 注記: 設計上の8列目
updatedAtはn8n Data Tableのシステム予約列名(POST /data-tablesが400 Column name "updatedAt" is reserved as a system column name.を返す)のため、列定義には含めていない。各行の更新日時はn8nが自動管理するupdatedAtメタデータで代替する。
- projectId:
-
ワークフロー
HC-SUB: プロセス実行と案内送信:XRqcykbG2LuAjGG2- ファイル:
workflows/hc-sub-run-process-and-notify.json(Execute Workflow Trigger、入力{resultId, processId}) - プロジェクト全体のn8nワークフロー構築ルール(2026-09-05改訂)に合わせて7ノード構成へ全面リビルド。旧19ノード版(個別キーごとのData Table Getノード×7、HTTP Requestノード×6を並べた構成)を置き換える。 同じワークフローID
XRqcykbG2LuAjGG2へのPUTで上書きする想定(デプロイはコントローラーが実施、本タスクではJSON作成・ローカル検証のみ) - active化済み(Execute Workflow Triggerサブワークフローは呼び出し元から実行可能にするためactive必須、
asKvC5LSVg3q8tuUと同じ運用)— 再デプロイ後も設定は維持される想定 - ノード構成(7ノード、リニア接続):
Execute Workflow Trigger(入力:resultId,processId)Data Table「設定値一括取得」:workflow_config_values(bNkadTyDgDepYx2p)をfilters無し・returnAll:trueで一括取得(個別キーごとのGetノードを廃止)Code「Pleasanter照会・選択肢組み立て」: 設定値のMap化、(任意)Process実行、レコード取得、サイト設定取得(getsite)、Botマスタ取得(484184)、対象者メール解決、選択肢組み立てまでを1ノードに集約。Pleasanter API呼び出しはすべてthis.helpers.httpRequest(n8n Codeノード公式ヘルパー)で発行Code「JWTクレーム組み立て」: JWTクレームJSON文字列の組み立てとLINEWORKSbutton_templateのactions配列組み立てを1ノードに集約JWTノード「Sign JWT」(operation: sign,algorithm: RS256, Credential: 「LINEWORKS Bot Private Key (v4)」idHw0qlEaGfLPnQWp1)Code「アクセストークン取得・LINEWORKS送信」: LINEWORKSアクセストークン取得とメッセージ送信を1ノードに集約(this.helpers.httpRequest)Data Table「状態更新」:healthcheck_bot_state(jqMDa2YZTI4f0iQ7)へinsert
- 秘密情報・SiteId等はすべて
workflow_config_values(bNkadTyDgDepYx2p)から「設定値一括取得」1ノードで取得し、直後のCodeノードでconfigKey→configValueのMapに変換して参照。ワークフローJSONに秘密値のハードコードなし - Execute Workflow Triggerの入力(
resultId/processId)は、後続ノードの直接の入力でない箇所では必ず$('Execute Workflow Trigger').item.json...のようにノード名を明示して参照している(旧版にあった「Data Tableノード通過後に裸の$jsonを参照してしまうバグ」の再発防止) - 未検証・要判断の暫定実装あり(Task 12以降で要確認):
①484184(
LINEWORKS_BOT_MASTER_SITE_ID)からのBotId解決ロジック(実データ構造未調査のためSiteSettings.BotIdsまたはProcesses[].BotIdを仮定し、無ければ例外を投げる。「JWTクレーム組み立て」ノードに実装) ②/api/users/getのレスポンス形状(配列/単一オブジェクト両対応の防御的実装、「Pleasanter照会・選択肢組み立て」ノードに実装) ③LINEWORKS token/message呼び出しをthis.helpers.httpRequestで行う際のform-urlencodedボディの正しい渡し方(URLSearchParams文字列+Content-Typeヘッダー明示という実装にしたが、n8n本体でこの組み合わせが期待通り動くかは実機未検証。ダメな場合はn8n-nodes-base.httpRequestノードのcontentType: "form-urlencoded"に戻す変更で対応) ④Data TableInsertノードのcolumns.mappingMode/value/schemaの形状(旧19ノード版から流用。旧版はデプロイ実績があるためスキーマ自体は疑わしくないが、実書き込みでの動作は本タスクでは未再検証) - テスト実行(Step 4相当)は本タスクでは未実施。次回、捨てレコードでの疎通確認とユーザー確認が必要
- ファイル:
-
ワークフロー
HC-WP: Statusプッシュ通知:swXfpoDtwZDT3Hwk- ファイル:
workflows/hc-wp-status-push.json - Webhook:
https://n8n32.next-hd.net/webhook/healthcheck-status-push(X-Api-Keyヘッダー認証、body{resultId, processId}) - active化済み
X-Api-Keyはworkflow_config_valuesのHEALTHCHECK_WP_API_KEYと照合。秘密値のハードコードなし- 実際のcurl疎通テスト(本番508971書き込み・LINEWORKS実送信を伴う)は未実施。ユーザー確認後に実施する
- デプロイ・活性化はサブエージェントのBashサンドボックスが実APIキー使用を一律ブロックしたためコントローラーが直接実行した(詳細:
task-10-report.md)
- ファイル:
-
ワークフロー
HC-WA: LINEWORKS応答受信: ローカルJSON作成のみ、n8n未デプロイ(id未採番)- ファイル:
workflows/hc-wa-lineworks-response.json(45ノード、Webhookhealthcheck-lineworks-response唯一の受信口、awaitInput(none/date/file)3分岐のSwitch構成) - 本タスクの担当範囲はワークフローJSONのローカル作成・検証までで、n8n Public APIの呼び出し(デプロイ・activate)は一切実施していない。コントローラー側での
node scripts/deploy-workflow.js workflows/hc-wa-lineworks-response.json実行後、実際のワークフローIDをこの行に追記すること - 秘密情報・SiteId等はすべて
workflow_config_values(bNkadTyDgDepYx2p)からData Tableノードで取得し式参照。ワークフローJSONに秘密値のハードコードなし - 未検証の暫定実装あり(詳細は
task-11-report.md): ①Data Tableupdate操作のパラメータ形状(get/insertは実機確認済みだが、updateは本タスクで初採用のため未検証)、②Switchノード(typeVersion 3)のrules.values[].outputKeyスキーマ、③/api/users/getをWhere無しで呼んだ場合のレスポンス形状(配列/.Value/単一オブジェクトいずれにも対応する防御的実装)、④api/items/{SiteId}/get(ColumnFilterHash検索)のレスポンス形状、⑤LINEWORKSファイル添付のダウンロード/Pleasanterアップロードのエンドポイント(ブリーフ記載どおり実装時にPleasanter公式マニュアルapi-attachment系で要確認のプレースホルダー) - 設計上の注記: HC-SUB(Task 9)が
healthcheck_bot_stateに保存するpendingProcessesは{processId, label, tooltip}のみでValidateInputsを持たないため、none分岐でのclassifyAwaitInput実行時はHC-WA内でサイト設定取得(getsite)を再実行し、ProcessId一致でフルのProcess定義を引き直す設計にした(Task 9側のファイルは変更していない)
- ファイル: