feat: Process実行→HC-WP通知の連携をクライアントスクリプトから自動化、実行ログのコメント記録を追加

これまで担当者がPleasanter画面でProcess実行した後、別途n8n Webhookを
手動で叩く必要があった。プロセス実行スクリプトのOnClickへWebhook自動POSTを
追加し、通知失敗時はプロセス実行自体を中断するようにした。あわせて
全Process実行時にコメント欄へ実行者・プロセス名を自動記録する。
This commit is contained in:
Kenichiro NOGI 2026-09-12 15:24:19 +09:00
parent bbf43f6097
commit 88351e4165
2 changed files with 105 additions and 0 deletions

View File

@ -0,0 +1,68 @@
// 健康診断管理 SiteId 508971: 既存のクライアントスクリプト「プロセス実行スクリプト」のBodyのみ
// ローカルファイルの最新内容で上書きする。Columns/EditorColumnHash/Processesには一切触れない。
"use strict";
const fs = require("fs");
const path = require("path");
const { findSiteDir, newModifyDir } = require("../../site-paths.js");
const PROJECT_NAME = "健康診断管理";
const ENV = "production";
const SITE_ID = 508971;
const REQUEST_LABEL = "update-clientscript-process";
const TITLE = "プロセス実行スクリプト";
const REPO_ROOT = path.join(__dirname, "..", "..", "..", "..");
const PROJECT_ROOT = path.join(REPO_ROOT, PROJECT_NAME);
const CONFIGS_DIR = path.join(PROJECT_ROOT, "configs", ENV);
const SCRIPT_FILE = path.join(
CONFIGS_DIR,
"site-508971_社員別健康診断管理",
"scripts",
"3_プロセス実行スクリプト.js"
);
function loadServerConfig() {
return JSON.parse(fs.readFileSync(path.join(REPO_ROOT, `config_${ENV}.json`), "utf-8"));
}
function loadLatest() {
const siteDir = findSiteDir(CONFIGS_DIR, SITE_ID);
const p = path.join(siteDir, "sitesettings", `site-${SITE_ID}_latest.json`);
const raw = JSON.parse(fs.readFileSync(p, "utf-8"));
return { current: raw.Response.Data, siteDir, rawText: fs.readFileSync(p, "utf-8") };
}
const execute = process.argv.includes("--execute");
const server = loadServerConfig();
(async () => {
const { current, siteDir, rawText } = loadLatest();
const settings = JSON.parse(JSON.stringify(current.SiteSettings));
settings.Links = current.SiteSettings.Links || [];
const script = (settings.Scripts || []).find((s) => s.Title === TITLE);
if (!script) {
console.error(`[エラー] スクリプト「${TITLE}」が見つかりません。`);
process.exit(1);
}
const newBody = fs.readFileSync(SCRIPT_FILE, "utf-8");
script.Body = newBody;
const requestBody = {
ApiVersion: 1.1, ApiKey: server.ApiKey, SiteId: SITE_ID,
Title: current.Title, ReferenceType: current.ReferenceType,
ParentId: current.ParentId, InheritPermission: current.InheritPermission,
SiteSettings: settings,
};
const modifyDir = newModifyDir(siteDir, REQUEST_LABEL);
fs.writeFileSync(path.join(modifyDir, `before_site-${SITE_ID}_latest.json`), rawText, "utf-8");
console.log("更新後Body文字数:", newBody.length);
if (!execute) {
console.log("(--execute 未指定のためプレビューのみ)");
return;
}
const url = `${server.BaseUrl}api/items/${SITE_ID}/updatesite`;
const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody) });
console.log(`[結果] HTTP ${res.status}:`, JSON.stringify(await res.json()));
})();

View File

@ -1504,3 +1504,40 @@ PDF再提出案内→送信→受付完了、いずれも正常動作。
ノードの`nextAwaitInput`分岐は`processId===5`限定のため、processId=19は影響なし単純な
テキスト送信のみ、待機状態も変更しない)。実機確認: Process19実行→HC-WP Webhook
processId=19→「■健康診断結果の再提出について」文言が正しく届くことを確認済み。
### 【重要】Process実行→HC-WP通知の連携が手動2段階だった問題を解消2026-09-12
これまでの運用①日程通知・⑤再検査通知・⑲診断書再提出依頼、いずれもは「①Pleasanter画面で
Process実行→②担当者が別途n8n Webhookを手動でPOST」という2段階だった設計時点で「現状は
手動。将来n8n側で自動化する可能性あり、未確定」と記載していた未解決事項。本番運用では
担当者がcurl等を叩けないため、このままでは機能しない。
**対応**: 508971にユーザーが新規用意したクライアントスクリプト「プロセス実行スクリプト」
`configs/production/site-508971_社員別健康診断管理/scripts/3_プロセス実行スクリプト.js`、
全17→19件のProcessのOnClickへ`$p.ex.processScript($(this));`を追加済みへ、Process実行
前にHC-WP Webhookを自動POSTする処理を追加した。
- OnClickスクリプトはProcess本体の処理Status遷移・DataChangesより**前**に実行される
(ユーザー確認済み)。`$p.execProcess()`はページ遷移を伴うため、実行後にWebhookを叩く
設計は成立しない。よって通知は必ず`execProcess`呼び出し**前**に行う
- Process 5日程通知済み・11再検査通知・19診断書再提出依頼のswitch文case内で
`confirmAndNotify(procName, $p.id(), procNum)`を呼び、確認ダイアログ→HC-WP Webhook POST
`https://n8n32.next-hd.net/webhook/healthcheck-status-push`、`resultId`は`$p.id()`で取得)
→失敗時は`alert`してプロセス自体を中断(`return`でcase内から関数全体を抜けるため、後続の
`$p.execProcess`は実行されない。ユーザーからの懸念に対し、JS仕様上switch内の`return`は
breakと異なり外側の関数から脱出することを確認済み
- 全Processで共通して、実行前にコメント欄へ「実行者氏名UserId:xxxプロセス名前」を
記録する処理を追加。Pleasanter標準の`#Comments`要素へ`$p.set()`でセットしておくと、
`execProcess`によるレコード更新と同時にコメントとして保存される(ユーザー提供の他サイト
実装例`$p.set($('#Comments'), history);`に倣った。`api/items/{id}/update`へ`Comment`
パラメータを直接POSTする方式は試したが反映されず不採用——Hashネストしないフラットな
パラメータが黙って無視される8章の既知挙動と同様の非対称動作
反映は`.claude/js/site-scripts/健康診断管理/update-clientscript-process-508971.js`
`update-clientscript-notice-508971.js`と同一パターン、Title="プロセス実行スクリプト")で実施。
**事故**: 実装中に`get-site-config.js --env=production`を実行してキャッシュを更新した際、
個別ファイル抽出処理によりローカル編集中の`3_プロセス実行スクリプト.js`が本番の未反映
(編集前)内容で上書きされる事故が発生(設計時点で既知だった「クライアントスクリプトの
ローカル編集後にget-site-config.jsを再実行すると上書きされる」パターンそのもの。編集を
再適用して復旧。実機確認は未実施次回、担当者がPleasanter画面からProcess5/11/19いずれかを
実行し、LINEWORKS通知とコメント記録の両方が機能するか確認すること