✅ 02_ユーザーストーリー.md - 作物マスタの定義を統一 ✅ 03_データ仕様書.md - 作物・品種マスタを更新 ✅ 04_画面設計書.md - 集計サイドバーと編集モーダルのUI ✅ 05_実装優先順位.md - Day 5-6に集計API・品種追加APIを追加 ✅ 06_Gemini向け統合指示書.md - コード例を全面更新
327 lines
11 KiB
Markdown
327 lines
11 KiB
Markdown
# 実装優先順位とマイルストーン
|
||
|
||
## 🎯 MVP(Phase 1)の完成定義
|
||
|
||
以下の全てが完了したら、Phase 1は完成とする:
|
||
|
||
### 機能完成基準
|
||
- [ ] ログイン・認証機能
|
||
- [ ] 作付け計画の一覧表示(PC/スマホ)
|
||
- [ ] 作付け計画の編集(個別・一括)
|
||
- [ ] 水稲共済細目書のCSV出力
|
||
- [ ] 中山間交付金のCSV出力
|
||
- [ ] 前年度作付けのコピー機能
|
||
- [ ] 3種類のマスタデータインポート
|
||
|
||
### 品質基準
|
||
- [ ] PCで快適に操作できる(レスポンス1秒以内)
|
||
- [ ] スマホで見やすい(文字16px以上)
|
||
- [ ] 出力されるCSVが正確(手動検証でOK)
|
||
|
||
### ユーザビリティ基準
|
||
- [ ] 作付け計画の登録が10分以内で完了
|
||
- [ ] 申請書のダウンロードが3クリック以内
|
||
- [ ] スマホでの圃場検索が3タップ以内
|
||
|
||
**目標完成日: 2025年2月末(水稲共済の1回目申請に間に合わせる)**
|
||
|
||
---
|
||
|
||
## 📅 実装スケジュール(10日間想定)
|
||
|
||
### Day 1-2: 環境構築 & 基盤実装
|
||
|
||
**Day 1: プロジェクトセットアップ**
|
||
- [ ] Dockerコンテナの構築
|
||
- PostgreSQL (PostGIS拡張)
|
||
- Django (バックエンド)
|
||
- Next.js (フロントエンド)
|
||
- [ ] Djangoプロジェクト初期化
|
||
- `django-admin startproject`
|
||
- GIS設定 (`GDAL`, `GEOS`)
|
||
- 環境変数管理 (`.env`)
|
||
- [ ] Next.jsプロジェクト初期化
|
||
- `create-next-app`
|
||
- Tailwind CSS設定
|
||
- 環境変数管理
|
||
|
||
**Day 2: 認証機能**
|
||
- [ ] Django: ユーザーモデル (メール認証)
|
||
- [ ] Django: JWT認証設定 (`djoser`, `djangorestframework-simplejwt`)
|
||
- [ ] Next.js: ログイン画面
|
||
- [ ] Next.js: 認証コンテキスト (`AuthContext`)
|
||
- [ ] 動作確認: ログイン→ダッシュボード遷移
|
||
|
||
---
|
||
|
||
### Day 3-4: データモデル & インポート機能
|
||
|
||
**Day 3: データベース設計**
|
||
- [ ] Django: モデル定義
|
||
- `Field` (実圃場)
|
||
- `OfficialKyosaiField` (共済マスタ)
|
||
- `OfficialChusankanField` (中山間マスタ)
|
||
- `Plan` (作付け計画)
|
||
- `Crop` (作物マスタ)
|
||
- `Variety` (品種マスタ)
|
||
- [ ] マイグレーション実行
|
||
- [ ] 管理画面での動作確認
|
||
|
||
**Day 4: インポート機能**
|
||
- [ ] Django: インポートAPI実装
|
||
- `pandas` + `odfpy` でODS読み込み
|
||
- 共済マスタインポート
|
||
- 中山間マスタインポート
|
||
- 吉田農地台帳インポート(紐付け処理含む)
|
||
- [ ] Next.js: データ管理画面
|
||
- ファイルアップロードUI
|
||
- プレビュー表示
|
||
- インポート実行ボタン
|
||
- [ ] 動作確認: 実際のODSファイルをインポート
|
||
|
||
---
|
||
|
||
### Day 5-6: 作付け計画機能(コア機能)
|
||
|
||
**Day 5: 作付け計画API**
|
||
- [ ] Django: 作物・品種マスタの初期データ投入
|
||
- 作物: 米、トウモロコシ、エンドウ、野菜、その他
|
||
- 品種: 米(にこまる等)、その他(完全休耕等)
|
||
- [ ] Django: 作付け計画API
|
||
- 一覧取得 (`GET /api/plans/?year=2025`)
|
||
- 作成・更新 (`POST /api/plans/`, `PATCH /api/plans/{id}/`)
|
||
- 一括更新 (`POST /api/plans/bulk/`)
|
||
- 前年度コピー (`POST /api/plans/copy_from_previous_year/`)
|
||
- **品種追加API** (`POST /api/varieties/`) - その場で品種を追加
|
||
- **集計API** (`GET /api/plans/summary/?year=2025`) - サイドバー用
|
||
- [ ] API動作確認 (Postman or curl)
|
||
|
||
**Day 6: 作付け計画UI**
|
||
- [ ] Next.js: 作付け計画一覧画面
|
||
- テーブル表示
|
||
- 検索・フィルタ機能
|
||
- 未割当のハイライト
|
||
- **集計サイドバー(開閉可能)**
|
||
- 作物別・品種別の合計面積
|
||
- リアルタイム更新
|
||
- **スマホ: 集計モーダル表示**
|
||
- [ ] Next.js: 作付け計画編集モーダル
|
||
- 作物選択(ドロップダウン)
|
||
- **品種選択(統一UI)**
|
||
- プリセット品種のドロップダウン
|
||
- [+ 新しい品種を追加]ボタン
|
||
- すべての作物で同じ操作
|
||
- 一括割当対応
|
||
- [ ] Next.js: 前年度コピーボタン
|
||
- [ ] 動作確認: 作付け計画を実際に入力
|
||
|
||
---
|
||
|
||
### Day 7-8: 申請書出力機能
|
||
|
||
**Day 7: 申請書ロジック実装**
|
||
- [ ] Django: 水稲共済細目書PDF生成
|
||
- 共済マスタをベースに集約
|
||
- 紐づく実圃場の作付けを名寄せ
|
||
- HTMLテンプレート作成
|
||
- WeasyPrintでPDF変換
|
||
- [ ] Django: 中山間交付金PDF生成
|
||
- 中山間マスタをベースに集約
|
||
- HTMLテンプレート作成
|
||
- [ ] 動作確認: PDFの内容と見た目を手動チェック
|
||
|
||
**Day 8: 申請書ダウンロードUI**
|
||
- [ ] Next.js: 申請書ダウンロード画面
|
||
- 年度選択
|
||
- プレビュー表示(新しいタブでPDF)
|
||
- PDFダウンロードボタン
|
||
- [ ] 動作確認: PDFをダウンロードして印刷してみる
|
||
|
||
---
|
||
|
||
### Day 9: スマホ対応 & UI調整
|
||
|
||
**Day 9: レスポンシブ対応**
|
||
- [ ] Next.js: スマホ用レイアウト調整
|
||
- 作付け計画一覧(カード型)
|
||
- 圃場詳細画面
|
||
- タップ領域の調整
|
||
- [ ] 文字サイズ・余白の調整
|
||
- [ ] 動作確認: 実機またはChrome DevToolsのモバイルビュー
|
||
|
||
---
|
||
|
||
### Day 10: テスト & 微調整
|
||
|
||
**Day 10: 総合テスト**
|
||
- [ ] 全機能の動作確認
|
||
- ログイン→作付け計画編集→申請書ダウンロードの一連の流れ
|
||
- 前年度コピー→編集→保存
|
||
- スマホでの参照
|
||
- [ ] バグ修正
|
||
- [ ] ドキュメント整備(README.md、使い方ガイド)
|
||
- [ ] 本番デプロイ準備(Dockerイメージのビルド)
|
||
|
||
---
|
||
|
||
## 🔧 技術スタックの詳細
|
||
|
||
### バックエンド (Django)
|
||
|
||
| 項目 | 採用技術 | 理由 |
|
||
|------|---------|------|
|
||
| フレームワーク | Django 5.0 | 安定性、豊富なエコシステム |
|
||
| REST API | Django REST Framework | 標準的なAPI構築ツール |
|
||
| 認証 | djoser + SimpleJWT | JWT認証の簡単な実装 |
|
||
| GIS | GeoDjango (PostGIS) | 地理情報の扱いに最適 |
|
||
| ファイル解析 | pandas + odfpy | ODS/Excelの読み込みに対応 |
|
||
| PDF生成 | WeasyPrint | HTML→PDF変換、日本語対応 |
|
||
| データベース | PostgreSQL 16 + PostGIS 3.4 | 空間データの保存・検索 |
|
||
|
||
### フロントエンド (Next.js)
|
||
|
||
| 項目 | 採用技術 | 理由 |
|
||
|------|---------|------|
|
||
| フレームワーク | Next.js 14 (App Router) | SSR/SSG対応、モダンな開発体験 |
|
||
| スタイリング | Tailwind CSS | 高速なUI開発 |
|
||
| 状態管理 | React Context API | シンプルな認証状態管理 |
|
||
| HTTPクライアント | fetch API (native) | 軽量、標準API |
|
||
| テーブル | react-table (TanStack Table) | 高機能なテーブルコンポーネント |
|
||
|
||
### インフラ (Docker)
|
||
|
||
| 項目 | 採用技術 | 理由 |
|
||
|------|---------|------|
|
||
| コンテナ化 | Docker Compose | 開発・本番環境の統一 |
|
||
| データベース | postgis/postgis:16-3.4 | PostGIS公式イメージ |
|
||
| リバースプロキシ | Nginx (開発環境) | 静的ファイル配信 |
|
||
|
||
---
|
||
|
||
## 📦 実装の粒度(コードレベル)
|
||
|
||
### 最小限の実装で済むもの
|
||
- ログイン画面: メール+パスワードのみ(パスワードリセットは後回し)
|
||
- ダッシュボード: サマリー表示のみ(グラフは不要)
|
||
- 地図機能: Phase 1では不要(住所テキストのみ)
|
||
|
||
### しっかり作り込むもの
|
||
- 作付け計画一覧: 検索・フィルタ・ソート機能
|
||
- 編集モーダル: 入力バリデーション、エラー表示
|
||
- 申請書CSV: 正確なデータ集計ロジック
|
||
|
||
### Phase 2以降に回すもの
|
||
- 栽培履歴(播種日、作業記録)
|
||
- カレンダー表示
|
||
- 資材計画
|
||
- 過去年度の比較
|
||
|
||
---
|
||
|
||
## 🚀 デプロイ計画
|
||
|
||
### 開発環境
|
||
- ローカルマシン: Docker Compose
|
||
- URL: `http://localhost:3000`
|
||
|
||
### 本番環境(Phase 1後)
|
||
- サーバー: VPS or クラウド(AWS/GCP/さくらVPS)
|
||
- ドメイン: `keina.example.com` (仮)
|
||
- HTTPS: Let's Encrypt
|
||
- リバースプロキシ: Traefik or Nginx
|
||
|
||
### バックアップ戦略
|
||
- データベース: 毎日自動バックアップ(`pg_dump`)
|
||
- ファイル: CSVエクスポートでユーザー自身がバックアップ
|
||
|
||
---
|
||
|
||
## 🧪 テスト戦略
|
||
|
||
### Phase 1では自動テスト不要
|
||
- **理由**: シングルユーザー、手動検証で十分
|
||
- **代わりに**: 手動チェックリストで品質保証
|
||
|
||
### 手動チェックリスト
|
||
|
||
#### 機能テスト
|
||
- [ ] ログインできる
|
||
- [ ] 作付け計画を登録できる
|
||
- [ ] 作付け計画を編集できる
|
||
- [ ] 一括割当ができる
|
||
- [ ] 前年度コピーができる
|
||
- [ ] 水稲共済PDFをダウンロードできる
|
||
- [ ] 中山間PDFをダウンロードできる
|
||
- [ ] PDFをプレビュー表示できる
|
||
- [ ] スマホで圃場詳細を見られる
|
||
|
||
#### データ整合性テスト
|
||
- [ ] 共済PDFの耕地番号が正しい
|
||
- [ ] 中山間PDFのIDが正しい
|
||
- [ ] 作物の名寄せが正しい(重複排除)
|
||
- [ ] 未割当の圃場が適切に扱われる
|
||
- [ ] PDFの表レイアウトが整っている
|
||
- [ ] PDFをA4用紙に印刷して見やすい
|
||
|
||
#### UI/UXテスト
|
||
- [ ] PCで見やすい(文字サイズ、余白)
|
||
- [ ] スマホで見やすい(タップ領域、スクロール)
|
||
- [ ] エラーメッセージがわかりやすい
|
||
- [ ] ローディング中の表示
|
||
|
||
---
|
||
|
||
## 🔍 潜在的な技術的課題と対策
|
||
|
||
### 課題1: PostGISの設定
|
||
**問題**: Dockerコンテナ内でGDAL/GEOSのパスが通らない
|
||
**対策**: 公式PostGISイメージを使用、Djangoの`GDAL_LIBRARY_PATH`を明示的に設定
|
||
|
||
### 課題2: ODSファイルの文字コード
|
||
**問題**: 日本語の文字化け
|
||
**対策**: `pd.read_excel(..., engine='odf')` でUTF-8として読み込み
|
||
|
||
### 課題3: 作物の名寄せロジック
|
||
**問題**: 複数の実圃場が1つの共済区画に紐づく場合の集約
|
||
**対策**: Pythonのセットで重複排除 → カンマ区切りで結合
|
||
|
||
### 課題4: スマホでのテーブル表示
|
||
**問題**: 横スクロールが発生
|
||
**対策**: カード型レイアウトに変更(Tailwindの`@media`クエリ)
|
||
|
||
### 課題5: 大量データのパフォーマンス
|
||
**問題**: Phase 2以降、栽培履歴が増えると遅くなる
|
||
**対策**: ページネーション、インデックス最適化(Phase 2で対応)
|
||
|
||
---
|
||
|
||
## 📝 開発時の注意点
|
||
|
||
### コーディング規約
|
||
- **Python**: PEP 8準拠、型ヒント推奨
|
||
- **JavaScript**: ESLint + Prettier、関数コンポーネント優先
|
||
- **命名**: 英語(camelCase or snake_case)、略語は避ける
|
||
|
||
### コミットメッセージ
|
||
```
|
||
feat: 作付け計画一覧APIを実装
|
||
fix: 共済CSVの面積計算バグを修正
|
||
docs: READMEにセットアップ手順を追加
|
||
style: Tailwindクラスを整理
|
||
```
|
||
|
||
### ブランチ戦略
|
||
- `main`: 本番環境
|
||
- `develop`: 開発環境
|
||
- `feature/*`: 機能開発
|
||
|
||
---
|
||
|
||
## 🎉 Phase 1完成後の振り返り
|
||
|
||
完成したら、以下を実施:
|
||
1. **使用感チェック**: 実際に作付け計画を入力してみる
|
||
2. **申請書検証**: 出力されたCSVを役場の書式と照合
|
||
3. **改善点の洗い出し**: 「ここがもっとこうだったら...」を記録
|
||
4. **Phase 2の要件整理**: 栽培履歴機能の詳細を詰める
|