ken_nogi/NodeSrv/docs/superpowers/specs/2026-09-05-healthcheck-lineworks-survey-n8n-design.md
Kenichiro NOGI 2939487c4f 健康診断管理LINEWORKS連携設計をプロセス機能流用型に全面改訂
ヒアリングで判明した実際のフロー(日程通知→了承/変更→受診確認→
結果受取り)がステータス駆動の対話型であり、単純な順次質問アンケート
ではないと判明。LINE WORKS Bot APIに「トークを開いた」検知イベントが
存在しない制約も踏まえ、プッシュ型通知+フォールバック応答方式に変更。
フロー定義用の新規マスタは作らず、プリザンター標準のProcess機能
(現在の状況/変更後の状況/ツールチップ/入力検証タブ)をそのまま
定義source として使う設計に切り替えた。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 10:57:20 +09:00

12 KiB
Raw Blame History

健康診断管理×LINEWORKS Bot連携 n8n化 設計書

  • 作成日: 2026-09-05
  • 対象: プリザンター「健康診断管理」プロジェクトSiteId 508971へLINEWORKS Bot経由の対話型ステータス管理機能を実装
  • 位置付け: 既存Express実装OldCode/express/modules/lineworksSurvey.js、仕様書Pleasanter/LINEWORKSアンケート管理/docs/lineworks-survey-scheme.mdとは別物としてn8nで新規構築。単純な順次質問アンケートではなく、プリザンターのProcess機能をそのままフロー定義として使うステータス駆動型対話ボット

1. 背景・既存Express実装との違い

Express版ケアセブンプロジェクト向けは「アンケート開始→設問を順番に送信→全問回答で1レコードcreate」という一方向の順次アンケートだった。今回の健康診断管理版は要件が異なる。

  • 508971は1レコード1回の健診。フローは「日程通知→了承/変更→受診確認→結果受取り」のようにレコードのStatusを段階的に進める対話であり、設問の連続ではない
  • LINE WORKS Bot APIの制約上、「トークを開いた瞬間」を検知するイベントは存在しない(コールバックイベントはmessage/join/leave/joined/left/postbackのみ。そのため「初期表示切替」は、①Statusが変わった瞬間にBotから能動的にメッセージを送るプッシュ型、②ユーザーが何か送信したら現在Statusの案内を返すフォールバック、の組み合わせで実現する
  • アンケート実行管理・Bot・対象者マスタは新設せず、既存資産を流用する後述
  • フロー定義Statusごとの案内文・選択肢・遷移先を管理する専用マスタは新設しない。508971自体のSiteSettings.Processes(プロセス機能)をそのままフロー定義として使う
  • サーバー実装はExpressでなくn8n。会話の待機状態はn8nプロセスのメモリではなく、n8n Data Table新規bot_conversation_state)で保持する

n8n環境自体の詳細URL・API・既存ワークフロー・過去の罠NodeSrv/apps/n8n/docs/n8n-guide.md参照。以下の設計はこのガイドの制約コンテナメモリ768MB、Data Table操作の罠、Schedule Trigger運用方針等を踏まえている。

2. 前提とした既存資産の流用

用途 流用元
Bot 既存「LINEWORKSアンケート管理」プロジェクトのSiteId 484184LINEWORKS Bot管理をそのまま参照。健康診断管理側にBotマスタは新設しない
対象者解決 プリザンター標準Usersのメールアドレスを、そのままLINEWORKS宛先IDuserIdとして使う。LINE WORKS側からの受信時もsource.userId=メールアドレスという前提で扱う(専用マッピングマスタは不要)
対象レコード特定 LINEWORKSから届いたメッセージの送信者メール→508971の中で、そのユーザーが紐づくレコードのうち未完了Status 900/910以外の最新レコードを対象とする。複数該当時の自動判定は行わず、実装上は「複数ヒット」を異常系として扱う

3. 全体アーキテクチャ

[プリザンター508971] Statusが変わる契機は2種類
  (a) 担当者がProcessボタンを押す例:①日程通知発行、日程確定時)
  (b) Bot対話の結果としてProcessが実行される例:②→③)

(a)の場合
        ▼
n8n: WP「Statusプッシュ通知」(Webhook, 508971クライアントスクリプトから起動)
  └ resultId・processIdを受け取りレコード取得
  └ 該当Processの案内文ツールチップ欄をレコード値で置換
  └ 対象者メール解決 → LINEWORKS Bot APIで案内選択肢を送信
  └ n8n Data Table「bot_conversation_state」に提示内容を記録
        ▼
LINEWORKS トーク
        │ ユーザー返信(ボタン押下/テキスト/ファイル)
        ▼
n8n: WA「LINEWORKS応答受信」(Webhook、唯一の受信口、署名検証)
  └ 送信者メール解決 → 508971の対象レコード特定
  └ bot_conversation_stateの待機状態を見て回答を処理
  └ 該当Processを`ProcessId`指定でapi/items/updateへ実行 → Status遷移
  └ 遷移後の新Statusに紐づく次のProcess群を取得し、次の案内を送信WPと共通ロジック

4. フロー定義: 508971のProcess機能をそのまま流用

新規マスタサイト・新規テーブルは作らない。プリザンター標準の「プロセス」設定画面画面種別・現在の状況・変更後の状況・表示名・ツールチップ・入力検証タブ等を、Bot対話の定義としてそのまま使う。

Processの項目 Bot連携での役割
現在の状況CurrentStatus変更後の状況ChangedStatus 既存のStatus遷移定義をそのまま使う
表示名DisplayName Botが提示する選択肢ボタンのラベル
ツールチップ Bot案内文言。{検査機関} {日程}のようなプレースホルダーを書いておくと、n8nがレコードの実際の値に置換してから送信する
入力検証タブの「項目」 このProcess実行に追加入力を伴うかの判定に流用。列名プレフィックスで種別を判定するDate*→日付入力を1往復挟む、Attachments*→ファイル受信を1往復挟む、項目なし→即実行
ProcessId n8nがPOST /api/items/{resultId}/updateProcessIdパラメータとして渡して実行する。公式マニュアル記載の通り、APIからのプロセス実行では入力検証プリザンター標準の検証機能は適用されない点に注意

新フローを追加する際の運用手順:

  1. 508971のProcessを1つ追加現在の状況・変更後の状況・表示名・ツールチップ文言を設定
  2. 追加入力が必要なら、入力検証タブの「項目」に対象列(Date*またはAttachments*)を登録
  3. n8nワークフローWP/WAは無改修。現在Statusに紐づくProcess一覧を都度getsiteから動的に取得する設計のため、Process追加だけで新フローを反映できる

5. n8n側詳細

Data Table「bot_conversation_state」新規

内容
resultId 508971のResultId
targetEmail 対象者メールアドレスLINEWORKS userId
currentStatus 直近提示時点のStatus値
pendingProcesses 直近提示した選択肢一覧([{processId, label, validateColumn}]のJSON文字列
awaitInput none(選択肢待ち)/date(日付入力待ち)/file(ファイル受信待ち)
awaitProcessId 追加入力完了後に実行すべきProcessIdawaitInputdate/fileの間のみ使用)
awaitColumn 追加入力先の列名(例: Date001
updatedAt 最終更新日時

n8n-guide.md 7-1Clear出力の握り潰し・7-2複数行が後続へそのまま渡ると行数分繰り返し実行されるの罠を踏まえ、1レコード=1行の読み書きに限定し、複数行を横断する集約処理は入れない。セッションタイムアウトの概念は持たないユーザーの都合のいいタイミングで返信されればよい性質のフローのため、待機状態は無期限に保持する

ワークフロー構成

  • WP Statusプッシュ通知: WebhookトリガーX-API-Keyヘッダー認証、508971のクライアントスクリプト専用。担当者がProcessボタンを押した時に起動
  • WA LINEWORKS応答受信: WebhookトリガーLINE WORKS本体からの直接コールバック、x-works-signatureをHMAC-SHA256検証。唯一の受信口
  • タイムアウト監視ワークフローは持たない3節参照

WAの処理詳細

  1. 署名検証 → 送信内容(テキスト/ボタン応答/ファイル)を判定
  2. 送信者メール解決 → 508971の対象レコード未完了の最新1件を特定
  3. bot_conversation_stateから該当resultIdの待機状態を取得
  4. 待機状態なし、またはawaitInput=noneで回答が選択肢と不一致 → 現在Statusに紐づくProcess群をgetsiteから再取得し、案内を再送(フォールバック)
  5. awaitInput=noneで回答が選択肢DisplayNameと一致:
    • 対象列なし → 即座にProcessId実行 → 新Statusの次Process群を取得 → 次の案内を送信
    • 対象列がDate*awaitInput=dateawaitProcessIdawaitColumnを記録し、「日付を入力してください」を追加送信Process実行は保留
    • 対象列がAttachments* → 同様にawaitInput=fileで保留し、ファイル送信を促す
  6. awaitInput=date → 受信テキストを日付として検証Express版の和暦・月日省略対応ロジックを踏襲awaitColumnをupdate → awaitProcessIdProcessId実行 → 新Status提示 → 待機状態をnoneへ戻す
  7. awaitInput=file → 受信がファイルでなければ再送要求。ファイルならLINEWORKS Bot APIでダウンロード → Pleasanter添付ファイルAPIでawaitColumnへアップロード → awaitProcessIdProcessId実行 → 新Status提示 → 待機状態をnoneへ戻す

認証まわり

  • LINEWORKS Bot APIメッセージ送信: 既存Credential「LINEWORKS Bot Private Key (v4)」(Hw0qlEaGfLPnQWp1)が流用できるか、BotIdとの対応関係を実装時に確認する
  • 対象者メール解決: POST api/users/getView:{ApiGetMailAddresses:true}。org-master-sync③で実績のある実装パターンを流用

6. エラーハンドリング・異常系

  • 対象レコードが複数ヒット同一ユーザーの未完了レコードが2件以上→ 自動判定せず、担当者確認が必要な異常系として扱うBot応答は保留し、通知等は今後の実装計画で検討
  • 選択肢に一致しない回答 → 選択肢を再提示4節のフォールバックと同じ経路
  • 日付形式不正/ファイル未送信 → エラーメッセージ+再送、待機状態は維持
  • LINEWORKS送信失敗・508971 update失敗 → n8n Execution HistoryPostgres保存に残す。追加のログ実装はしない

7. 導入・検証方針

  • n8n運用ルールn8n-guide.md 9章に従い、ワークフローの構築・編集自体は確認不要。Webhook実行によるプリザンター書き込み・LINEWORKS送信を伴うテストは都度事前確認
  • 初回検証は1Process・1件のみで実施し、疎通確認後にフロー全体①〜③の通し検証に進める
  • 508971は本番の健診データそのものなので、検証は既存レコードを壊さない捨てレコードを用意して行う

8. 未確定事項(実装時に個別確定)

  • 具体的なProcess定義①日程通知〜③検査結果受取りの各Process内容、Status値の追加・修正は508971のStatus設計がまだ未完成のため、実装着手時に個別に設計する
  • LINEWORKS Bot Private Key CredentialとBotId484184側の対応関係の実機確認
  • LINEWORKS Bot APIでのファイル受信ダウンロードURL取得とPleasanter添付ファイルAPIへのアップロードの具体的な実装方法
  • 今後フロー内容の詳細が追加判明する前提のため、4節の枠組みProcess流用の汎用性を保ったまま個別Processを増やしていく