Newer
Older
client_dwatch / lib / fixtures / prechecks.ts
import { PRECHECK_MINUTES_BEFORE } from "@/lib/config";
import type { PrecheckItem } from "@/lib/types";
import { at } from "./_helpers";

// ★分数を直書きしないための別名(禁止事項3 / CLAUDE.md §7)★
//   `PRECHECK_MINUTES_BEFORE`(`lib/config/index.ts`)は事前チェックの回次順(60分前 → 30分前)。
//   設定値が変われば fixtures のラベルも一緒に変わるのが正しい。
const [FIRST_ROUND_MINUTES, SECOND_ROUND_MINUTES] = PRECHECK_MINUTES_BEFORE;

/**
 * アラート(事前チェック)のサンプルデータ
 *
 * docs/fixtures.md §3 のケースを網羅。
 *   - ★事前チェック異常(`severity: "precheck"`)だけ★(ユーザー判断 2026-10-29。アラートは出発失敗を出さない)。
 *     旧 `launch_failed`(出発失敗)の id 4 / 8 は消した(★id は振り直さない★。4・8 は欠番)
 *   - 分数の3通り(60分前 / 30分前 / 20分前)
 *   - 3ステータスすべて(未解消 / 対応中 / 解消)
 *   - 解消済み: responded_at と resolved_at の両方あり
 *   - 対応中:   responded_at のみ、resolved_at は null
 *   - 未解消:   両方 null
 *   - バッテリー低下(Pudu APIで取得可能と確認済み)
 *   - ★`main_run_succeeded`(親の本清掃が ◎○ か。D-171)は各行に明示する★ —
 *     ★true は id 6(「30分前までに充電完了、出発成功」)だけ★。id 7(完了率62% = △)・
 *     ほかは false。★対応状況・件数はこの値で変わらない★(画面がカードを控えめにするだけ)
 *
 * ★ responded_at / resolved_at の2カラム構成は D-013(TeamWorks回答待ち)★
 *   APIスキーマは2カラム前提で先行実装している。
 *
 * ★★`robot_status` は日本語のまま置いている(指示書S 2-4 の判断。D-105)★★
 *   実DB経由では `robot_error_reports.error_type` の生値がそのまま入る(D-077 / D-098)ので、
 *   英語識別子に寄せたほうが「実データに近い fixtures」にはなる。★それでも寄せない★:
 *   1. ★`lib/fixtures/clean-logs.ts` の `status_1h` / `status_30m` が日本語のまま★で、
 *      `scripts/seed-local-db.ts` はその値を `error_type` に**そのまま**入れている。
 *      こちらだけ英語にすると、同じロボット状態が fixtures では英語・ローカルDBでは
 *      日本語という ★逆向きの食い違い★ が生まれる(2ファイルを同時に変える話になり、
 *      それは `prechecks` 1本という本指示書の範囲を超える)。
 *   2. ★`ROBOT_STATUS_TONES`(`lib/config/index.ts`)は日本語6値の完全一致で色を引く★ため、
 *      英語に寄せると fixtures のデモがすべてグレーになる。指示書R(D-099 項2-2)も
 *      ★`Standby.` を `ROBOT_STATUS_TONES` に足さない★という同じ側の判断をしている。
 *   ★帰結★: `USE_FIXTURES` の true / false で `robot_status` の値が一部違う(★想定内★)。
 *   ★実データの `error_type` を受領したら(D-090 項18)まとめて寄せる★。
 */
export const prechecks: PrecheckItem[] = [
  // --- 未解消(両方 null) ---
  {
    id: "1",
    severity: "precheck",
    precheck_minutes: FIRST_ROUND_MINUTES,
    serial_number: "8111R5628060022",
    facility_id: 2,
    facility_name: "バリューマート北町店",
    scheduled_at: at(0, "02:00"),
    robot_status: "ハンドルアップ",
    detected_at: at(0, "01:00"),
    resolution_status: "unresolved",
    responded_at: null,
    resolved_at: null,
    note: "30分前も未解消 → 出発失敗",
    battery_level: 78,
    main_run_succeeded: false,
  },
  {
    id: "2",
    severity: "precheck",
    precheck_minutes: SECOND_ROUND_MINUTES,
    serial_number: "8111R5628060077",
    facility_id: 6,
    facility_name: "バリューマート南丘駅前店",
    scheduled_at: at(0, "02:30"),
    robot_status: "オフライン",
    detected_at: at(0, "02:00"),
    resolution_status: "unresolved",
    responded_at: null,
    resolved_at: null,
    note: "30分前もオフライン → 出発失敗",
    battery_level: null,
    main_run_succeeded: false,
  },
  {
    // バッテリー低下のケース
    id: "3",
    severity: "precheck",
    precheck_minutes: FIRST_ROUND_MINUTES,
    serial_number: "8111R5628060133",
    facility_id: 9,
    facility_name: "メガバリューマート三ツ橋中央ショッピングセンター店",
    scheduled_at: at(0, "02:30"),
    robot_status: "充電中",
    detected_at: at(0, "01:30"),
    resolution_status: "unresolved",
    responded_at: null,
    resolved_at: null,
    note: "バッテリー残量が低く、予定時刻までに充電完了しない可能性",
    battery_level: 12,
    main_run_succeeded: false,
  },
  {
    // ★★境界値: 設定値(PRECHECK_MINUTES_BEFORE = 60 / 30)以外の任意の分数★★
    //   D-093 項2「20だったら20分前になります」を、型と画面が本当に表現できるかの検証。
    //   ★この1件だけは分数を設定値から取らない★ — 設定値と一致してしまうと
    //   「設定値以外でも出るか」という確認そのものが成立しない(禁止事項3 の例外)。
    id: "9",
    severity: "precheck",
    precheck_minutes: 20,
    serial_number: "8111R5628060011",
    facility_id: 1,
    facility_name: "メガバリューマート中央本店",
    scheduled_at: at(0, "02:00"),
    robot_status: "オフライン",
    detected_at: at(0, "01:40"),
    resolution_status: "unresolved",
    responded_at: null,
    resolved_at: null,
    note: null,
    battery_level: null,
    main_run_succeeded: false,
  },

  // --- 対応中(responded_at のみ) ---
  // ★id 4(出発失敗)は 2026-10-29 に消した(アラートは出発失敗を出さない)★
  {
    id: "5",
    severity: "precheck",
    precheck_minutes: SECOND_ROUND_MINUTES,
    serial_number: "8111R5628060011",
    facility_id: 1,
    facility_name: "メガバリューマート中央本店",
    scheduled_at: at(1, "02:00"),
    robot_status: "ハンドルアップ",
    detected_at: at(1, "01:30"),
    resolution_status: "in_progress",
    responded_at: at(1, "09:02"),
    resolved_at: null,
    note: "店舗責任者にヒアリング中",
    battery_level: 64,
    main_run_succeeded: false,
  },

  // --- 解消(両方あり) ---
  {
    id: "6",
    severity: "precheck",
    precheck_minutes: FIRST_ROUND_MINUTES,
    serial_number: "8111R5628060011",
    facility_id: 1,
    facility_name: "メガバリューマート中央本店",
    scheduled_at: at(1, "02:00"),
    robot_status: "充電中",
    detected_at: at(1, "01:00"),
    resolution_status: "resolved",
    responded_at: at(1, "01:20"),
    resolved_at: at(1, "01:45"),
    note: "30分前までに充電完了、出発成功",
    battery_level: 88,
    // ★出発成功(親の本清掃は ◎○)→ true★(D-171)。画面ではカードが控えめになる
    main_run_succeeded: true,
  },
  {
    id: "7",
    severity: "precheck",
    precheck_minutes: FIRST_ROUND_MINUTES,
    serial_number: "8111R5628060099",
    facility_id: 7,
    facility_name: "メガバリューマート緑野店",
    scheduled_at: at(1, "01:30"),
    robot_status: "緊急停止",
    detected_at: at(1, "00:30"),
    resolution_status: "resolved",
    responded_at: at(1, "00:50"),
    resolved_at: at(1, "01:10"),
    note: "30分前に復旧、出発成功(完了率62%)",
    battery_level: 71,
    // ★出発はしたが完了率62% = △ → false★(D-171 の M3)
    main_run_succeeded: false,
  },
  // ★id 8(出発失敗)は 2026-10-29 に消した(アラートは出発失敗を出さない)★
];

/**
 * 該当0件の日(未解消が0件 = サマリカードが0表示になる)を確認したいときは、
 * date_from / date_to に 2日前か3日前を指定してください(データは今日と昨日だけ。2日前の id 8 は 2026-10-29 に消した)。
 */