# 現場調査PWA 開発引継ぎ仕様

## 1. 目的と位置付け

このPWAは、地盤調査・振動調査の現場記録をスマートフォンで行う試作品である。電話以外のスマートフォン操作に不慣れな現場担当者が、紙手簿より速く、迷わず、入力内容を常に確認できることを優先する。

本社担当部署へ「この操作方式なら現場で利用できる」という提案を行うための検証用であり、正式採用時は会社作成アプリへ考え方と仕様を統合する。現在のPWAをそのまま正式業務システムにすることは想定していない。

## 2. 共通UI原則

- 頻繁な操作は1タップまたはEnterで完了させる。
- 入力欄はキーボードに隠れない位置へ固定し、連続入力中はテンキーを維持する。
- 入力済みデータを常時一覧表示し、現在位置と過去の傾向を同時に確認できるようにする。
- 押せる要素はボタンとして表示し、押した結果を即時表示する。
- 概要・配置・測定・レベル・確認などの工程表示はすべて移動ボタンとして機能させる。
- 文字入力より、選択、既定値、前回値、自動計算を優先する。
- 誤操作でデータを失わせない。削除は確認し、重要な操作には復元手段を設ける。
- 入力値は原則として即時にIndexedDBへ保存し、保存中・保存済み・保存失敗を表示する。
- 完成出力は必須項目とデータ整合性を満たすまで停止する。復旧用JSONは途中でも保存できる。
- オフライン利用を前提とし、案件データを外部サーバーへ送信しない。

## 3. モジュール

### 振動測定

5分間の測定、ストア・アドレス管理、道路車両・鉄道イベント、同分データの整理、Excel・JSON・Markdown出力を行う。実運用可能な試作段階。

### コンペネ

3点測定、読値平均、係数aによる地耐力計算、区間平均、標高確認、Excel報告書用JSONを扱う。係数aは案件共通、0.15～0.20、初期値0.17。実運用可能な試作段階。

### ラム

現在の主な検証対象。詳細は後述する。

### SWS

測定、土質整理、配置図、レベル、柱状図、会社指定手簿への出力を試作中。トップ画面では「使用不可」と表示する。

### 点検

既存Android点検アプリの統合試作。トップ画面では「使用不可」と表示する。

## 4. ラム測定仕様

### 案件概要

- 概要番号は11桁。初期表示は`041000`。
- 調査日、天候、測定者を必須とする。
- テストモードでは概要番号`04100000000`、当日、天候・測定者`テスト`を設定する。
- 測点名は`S1、S2…`の連番とする。

### 測定入力

- 深度は通常20cmずつ自動増加する。
- Ndm入力後にEnterで記録し、次のNdm欄へフォーカスを戻す。テンキーを維持する。
- 入力済みの深度、Ndm、Mv、Ndを一覧表示する。
- Ndは`Ndm - 0.040 × Mv`。画面、Excel、CSVで同じ値を使用する。
- Ndmが5を超える層はMv必須。Mvは複数層へまとめて入力でき、入力済み層は候補に表示しない。
- 5以下が1m続いたロッド接続深度では、時計回り2回転以上の案内を表示する。ロッド回転は手簿と完成条件に含めない。
- 測定終了を押した時点で入力途中のNdmも保存する。
- 最終層だけ1cm単位へ変更できる。Ndmは層厚換算しない。
- 中間層は20cm間隔とし、前後に20cmを超える空きを作らない。

### 修正・削除

- 記録済み行をタップして深度、Ndm、Mvを修正する。
- 途中行削除時は後続深度を20cmずつ詰める。
- 削除直後は削除した1行だけを元の位置へ復元できる。
- 新規入力、別行修正、測点切替後は古い削除操作を復元できない。
- 未入力測点は完全削除する。
- 入力済み測点は未使用点として保存し、手簿、CSV、配置図、完成条件から除外する。

### 測定終了

- 終了時刻を必須とする。
- 地下水位は「なし」または基準と数値を入力する。
- 最終深度を1cm単位で確定できる。
- 完了済み測点は再開して修正できる。

## 5. 配置図

- PDF、写真、画像を端末内で読み込み、サーバーへ送信しない。
- 測点開始前に配置図へ測点を置く。
- BMを別に配置できる。
- 測点・BMは長押し移動、背景は2本指の中点を中心に拡大縮小し、拡大後は1本指でパンする。
- 2本指操作では測点を追加しない。
- 測点の表示倍率はスライダーで変更し、画面とPDFで同じ相対寸法を使用する。

## 6. レベル計算

- 読み値はmm整数。
- 最初にBMなど既知点のBSを入力する。
- 通常入力はFSを連続記録し、その都度、配置図へ測定番号を置く。
- レベル点名は測定順の数字連番であり、地盤測点名とは別に管理する。
- 地盤測点マーカーをタップして置いた場合、レベル点と地盤測点を関連付ける。
- 据え変えは、既に高さが確定している点を選択してBSを入力する。同一行にBSとFSは入れない。
- 最初にBSを取った基準点を観測区間の最後にFSで見直す運用を想定する。
- 与点差・閉合差が20mmを超える場合は再測定とする。
- レベル行を削除した場合、番号を再利用せず欠番として保持する。
- 欠番はアプリとPDFレベル野帳へ`2 欠番`のように表示し、レベルExcelから除外する。復元可能とする。
- BM基準の高さはmmで表示する。

## 7. 完成条件

- 概要番号、調査日、天候、測定者が入力済み。
- 1測点以上あり、すべて配置・測定終了済み。
- 開始・終了時刻、標高、地下水位が確定済み。
- 全測定行の深度順序と間隔が正しい。
- Ndm、必要なMvが入力済み。
- レベル行にBSまたはFSの一方だけが入力されている。
- 最初のBM・BSと、BMへのFS見直しがある。
- 与点差・閉合差が20mm以内。
- 使用中のレベル点とBMが配置済み。

## 8. 出力

個別ボタンと「全出力ZIPを共有」を用意する。

- ラム手簿Excel：会社雛形へ値だけを書き込み、入力値は青文字。測点ごとに1シート。
- 社内連携用CSV：測点ごと、CP932、1行を引用符で囲ったタブ区切り、`RAM_REPORT`形式。
- 一般CSV：測点ごと、UTF-8 BOM、カンマ区切り、1層1行。
- 位置図PDF：配置図とレベル野帳を結合。欠番を表示する。
- レベルExcel：会社雛形へ入力し、欠番行は除外する。
- 復旧用JSON：未完成でも保存可能。配置図PDFの元バイト列は含めず、現在表示中の背景画像を保持する。
- 全出力ZIP：上記成果物、両CSV、復旧用JSON、内容説明を格納する。Web Share API対応端末ではAndroid共有画面を開き、使用者がSlack等を選ぶ。非対応環境ではZIPを保存する。

## 9. データ保存とセキュリティ

- ラム案件はIndexedDB `ram-pwa` の`projects`へ保存する。
- スキーマ識別子は`ram-project-v1`。互換追加は既存項目を破壊せずnormalizeで既定値を補う。
- 保存失敗を握りつぶさず、画面に固定表示して再保存操作を提供する。
- 配置図、測定値、Excel雛形、CSVはCloudflareへ送らない。
- Cloudflare Pagesには静的なHTML、CSS、JavaScript、汎用雛形だけを置く。

## 10. 主要ファイル

- `index.html`：トップ画面と各モジュールの入口。
- `app-v6.js`：トップ画面と振動測定。
- `ram.js`：ラムの状態、画面、入力、完成判定、ZIP共有。
- `ram-export.js`：ラム手簿Excel、社内CSV、一般CSV、レベルExcel。
- `field-common.js`：配置図操作、レベル計算、位置図・野帳PDF、レベルExcel共通処理。
- `ram.css`、`field-common.css`：ラム入力、配置図、レベル表。
- `ram-ledger-template.xlsx`：ラム手簿雛形。
- `level-template.xlsm`：レベル野帳雛形。
- `sw.js`：オフラインキャッシュと版管理。
- `DEVELOPMENT_HANDOFF.md`：本資料の原本。

## 11. 検証と既知の制約

- 本アプリは提案・現場テスト用であり、正式な権限管理、監査ログ、サーバー同期、複数端末同期を備えない。
- 報告書Excel側のRAM CSV読込機能は将来実装予定であり、現時点ではCSVの最終的な端から端までの検証ができない。
- Web Share APIの表示先は端末にインストールされた共有先による。アプリがSlackへ直接投稿するものではない。
- 正式採用時は会社アプリの技術基盤、認証、保存、更新、端末管理へ移植する。
- 変更時は、Ndm連続入力、深度修正、Mv後入力、測点切替、レベル据え変え、欠番、Excel・CSV・PDF・ZIPを一連の実データで再確認する。

## 12. 公開

`outputs/vibration-pwa`の内容をCloudflare Pagesの`vibration-measurement`へDirect Uploadする。`index.html`のアセット版と`sw.js`のキャッシュ名・アセット版を同時に更新する。公開後は`?v=版番号`で確認し、JavaScriptエラー、サービスワーカー更新、オフライン起動を確認する。
