11 KiB
11 KiB
実装優先順位とマイルストーン
🎯 MVP(Phase 1)の完成定義
以下の全てが完了したら、Phase 1は完成とする:
機能完成基準
- ログイン・認証機能
- 作付け計画の一覧表示(PC/スマホ)
- 作付け計画の編集(個別・一括)
- 水稲共済細目書のPDF出力
- 中山間交付金のPDF出力
- 前年度作付けのコピー機能
- 3種類のマスタデータインポート
品質基準
- PCで快適に操作できる(レスポンス1秒以内)
- スマホで見やすい(文字16px以上)
- 出力されるPDFが正確(手動検証で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: 作付け計画API(作物・品種はUIまたは管理画面から登録)
- 一覧取得 (
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: 作付け計画インライン編集
- 作物選択(テーブル内ドロップダウン)
- 品種選択(テーブル内ドロップダウン、作物選択後に有効化)
- 備考入力(テーブル内テキスト)
- 変更即時保存(バックグラウンド、スクロール維持)
- 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.2 | 安定性、豊富なエコシステム |
| 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では不要(住所テキストのみ)
しっかり作り込むもの
- 作付け計画一覧: 検索・フィルタ・ソート機能
- インライン編集: 即時保存、スクロール維持
- 申請書PDF: 正確なデータ集計ロジック、A4印刷対応
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: 共済PDFの面積計算バグを修正
docs: READMEにセットアップ手順を追加
style: Tailwindクラスを整理
ブランチ戦略
main: 本番環境develop: 開発環境feature/*: 機能開発
🎉 Phase 1完成後の振り返り
完成したら、以下を実施:
- 使用感チェック: 実際に作付け計画を入力してみる
- 申請書検証: 出力されたPDFを役場の書式と照合
- 改善点の洗い出し: 「ここがもっとこうだったら...」を記録
- Phase 2の要件整理: 栽培履歴機能の詳細を詰める