// 健康診断管理 SiteId 513156(実施年度-集計): EditorColumnHash.Generalの並びを // Num061→Num081→Num062→Num082…と交互配置に組み替えるワンショットスクリプト // (508971の並びに合わせる。508971にはNum061~071→Num081~091の連続配置で反映されており見た目が揃わないため)。 // Columns自体の変更は無く配置順のみ変更。updatesite(Mode:full)を使う。 // --execute指定時のみ実際に送信、指定なければプレビュー(送信Body・diff)のみ出力。 "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 = 513156; const SITE_NAME = "実施年度-集計"; const REQUEST_LABEL = "fix-editorcolumnhash-order"; 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 PAIRS = [ ["Num061", "Num081"], ["Num062", "Num082"], ["Num063", "Num083"], ["Num064", "Num084"], ["Num065", "Num085"], ["Num066", "Num086"], ["Num067", "Num087"], ["Num068", "Num088"], ["Num069", "Num089"], ["Num070", "Num090"], ["Num071", "Num091"], ]; function loadServerConfig() { const configPath = path.join(REPO_ROOT, `config_${ENV}.json`); const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); if (!config.BaseUrl || !config.ApiKey) { console.error(`[エラー] ${configPath} に BaseUrl / ApiKey を設定してください。`); process.exit(1); } return config; } function loadLatest() { const siteDir = findSiteDir(CONFIGS_DIR, SITE_ID); if (!siteDir) { console.error(`[エラー] configs/${ENV}/site-${SITE_ID}_* が見つかりません。先にget-site-config.jsを実行してください。`); process.exit(1); } 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") }; } function buildDesiredSiteSettings(current) { const settings = JSON.parse(JSON.stringify(current.SiteSettings)); const general = settings.EditorColumnHash.General; const pairSrcSet = new Set(PAIRS.map(([src]) => src)); const arishokenSet = new Set(PAIRS.map(([, dst]) => dst)); const rebuilt = []; for (const name of general) { if (arishokenSet.has(name)) continue; // 有所見者数側は元位置から除去し、対応する実施人数側の直後へ差し込む rebuilt.push(name); if (pairSrcSet.has(name)) { const pair = PAIRS.find(([src]) => src === name); rebuilt.push(pair[1]); } } settings.EditorColumnHash.General = rebuilt; // Links省略厳禁(全置換のため既存値をそのまま含める) settings.Links = current.SiteSettings.Links || []; return { settings, rebuilt }; } function buildUpdateBody(apiKey, current, desiredSettings) { return { ApiVersion: "1.1", ApiKey: apiKey, SiteId: SITE_ID, Title: current.Title, ReferenceType: current.ReferenceType, ParentId: current.ParentId, InheritPermission: current.InheritPermission, SiteSettings: desiredSettings, }; } const execute = process.argv.includes("--execute"); const server = loadServerConfig(); (async () => { const { current, siteDir, rawText } = loadLatest(); const { settings: desiredSettings, rebuilt } = buildDesiredSiteSettings(current); const body = buildUpdateBody(server.ApiKey, current, desiredSettings); const modifyDir = newModifyDir(siteDir, REQUEST_LABEL); const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); fs.writeFileSync(path.join(modifyDir, `before_site-${SITE_ID}_latest.json`), rawText, "utf-8"); const updatedPath = path.join(modifyDir, `site-${SITE_ID}_updated_${timestamp}.json`); fs.writeFileSync(updatedPath, JSON.stringify(body, null, 2), "utf-8"); console.log(`\n==== SiteId ${SITE_ID} (${SITE_NAME}) ====`); console.log("EditorColumnHash.General 変更後の並び:"); console.log(` [${rebuilt.join(", ")}]`); console.log(`プレビュー保存先: ${updatedPath}`); if (!execute) { console.log("\n(--execute 未指定のためプレビューのみ。送信していません)"); return; } const url = `${server.BaseUrl}api/items/${SITE_ID}/updatesite`; console.log(`送信先: ${url}`); const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); const json = await res.json(); console.log(`[結果] HTTP ${res.status}:`, JSON.stringify(json)); const resultPath = path.join(modifyDir, `site-${SITE_ID}_result_${timestamp}.json`); fs.writeFileSync(resultPath, JSON.stringify(json, null, 2), "utf-8"); })();