Newer
Older
client_dwatch / lib / config / advice-rules.ts
/**
 * 対応アドバイスのルール定義(既定値)
 *
 * ★文言(title / text / actions)はシステム管理の「運用設定」から編集できます★
 *   編集された内容は `data/settings/advice.json` に保存され、ここの既定値を上書きします。
 *   実行時は `lib/settings/advice.ts` の `loadAdviceRules()` を使ってください。
 *
 * ★発火条件(どのルールが該当するか)はここではなく `lib/judge/advice.ts` にあります★
 *   条件は仕様であり、文言は運用の都合で変わるものなので、意図的に分けています。
 *   文言を変えてもテストは壊れません。
 *
 * Phase A = CLAUDE.md 4.5 の R1〜R4
 * Phase B = エラーコード別のアドバイス(モックに存在していたもの)
 */

export type AdviceRuleId = "R1" | "R2" | "R3" | "R4" | "B1" | "B2" | "B3";

export interface AdviceRuleDefinition {
  id: AdviceRuleId;
  phase: "A" | "B";
  /** 1=注意 2=警告 3=重大。行バッジの色は該当ルールの最大レベルで決まる */
  level: 1 | 2 | 3;
  icon: string;
  /** 見出し(編集可) */
  title: string;
  /** 推定原因(編集可) */
  text: string;
  /** 推奨アクション(編集可) */
  actions: string[];
  /** 発火条件の説明。画面の設定編集時に「どんなときに出るか」を示すため(編集不可) */
  condition: string;
}

export const DEFAULT_ADVICE_RULES: Record<AdviceRuleId, AdviceRuleDefinition> = {
  R1: {
    id: "R1",
    phase: "A",
    level: 1,
    icon: "⚠",
    title: "出発失敗(R1)",
    text: "事前チェックのアラート内容を確認してください。セキュリティ未解除/ロボット異常/充電不足のいずれかが原因です。",
    actions: [
      "事前チェックのアラート内容を確認",
      "セキュリティ解除状況の確認",
      "ロボットの充電状態を確認",
    ],
    condition: "出発失敗(初回)",
  },
  R2: {
    id: "R2",
    phase: "A",
    level: 1,
    icon: "⚠",
    title: "完了率が極端に低い(R2)",
    text: "現場の通路状況+ロボット状態を確認してください。出発直後に停止した可能性があります。",
    actions: [
      "現場の通路状況を確認",
      "ロボット本体の状態を確認",
      "障害物の有無を現場に確認",
    ],
    condition: "完了率が10%未満",
  },
  R3: {
    id: "R3",
    phase: "A",
    level: 2,
    icon: "🔶",
    title: "2日連続で完了率低下(R3)",
    text: "恒常的な環境変化の可能性があります。現場責任者に状況をヒアリングしてください。",
    actions: [
      "現場責任者へのヒアリング",
      "運用手順の再教育",
      "消耗品交換の手配",
    ],
    condition: "同一施設で2日以上連続して△以下または出発失敗",
  },
  R4: {
    id: "R4",
    phase: "A",
    level: 3,
    icon: "🔴",
    title: "複数日連続で問題継続(R4)",
    text: "現場対応では解決しない構造的問題の可能性があります。DFAオンサイト訪問(マップ再作成・環境調査)の手配を検討してください。",
    actions: [
      "DFAオンサイト訪問の手配を検討",
      "マップ再作成の検討",
      "機体交換の検討",
    ],
    condition: "同一施設で3日以上連続して△以下または出発失敗",
  },

  // ---- Phase B(エラー種別ごとのアドバイス) ----
  B1: {
    id: "B1",
    phase: "B",
    level: 1,
    icon: "🗺",
    title: "マップ更新の確認",
    text: "マップがレイアウト変更に追従していない可能性があります。直近の棚替え・売場変更がなかったか現場に確認してください。",
    actions: ["直近の棚替え・売場変更の有無を確認", "マップ更新の要否を判断"],
    condition: "完了率が10%以上70%未満(△判定)",
  },
  B2: {
    id: "B2",
    phase: "B",
    level: 1,
    icon: "🔧",
    title: "ハンドルアップ検知",
    text: "ハンドルが上がった状態です。現場にハンドルを下ろすよう連絡してください。",
    actions: ["現場にハンドルを下ろすよう連絡", "誤操作の防止策を案内"],
    condition:
      "事前チェック(1回目または2回目)のステータスが lib/config/robot-status-match.ts の B2 リストに一致" +
      "(暫定値 Handrail Lifted。trim・大小文字無視。D-078 項2)",
  },
  B3: {
    id: "B3",
    phase: "B",
    level: 1,
    icon: "📡",
    title: "オフライン検知",
    text: "ネットワーク接続が切れています。Wi-Fiルーターの再起動を現場に依頼してください。",
    actions: ["Wi-Fiルーターの再起動を現場に依頼", "電波状況の確認"],
    condition:
      "事前チェック(1回目または2回目)のステータスが B3 リストに一致。" +
      "現在リストは空のため発火しない(値が未判明。D-078 項2)",
  },
};

/** 編集可能なフィールド(設定画面で書き換えられる範囲) */
export type EditableAdviceFields = Pick<
  AdviceRuleDefinition,
  "title" | "text" | "actions"
>;