📚 修正したドキュメント

 02_ユーザーストーリー.md - 作物マスタの定義を統一
 03_データ仕様書.md - 作物・品種マスタを更新
 04_画面設計書.md - 集計サイドバーと編集モーダルのUI
 05_実装優先順位.md - Day 5-6に集計API・品種追加APIを追加
 06_Gemini向け統合指示書.md - コード例を全面更新
This commit is contained in:
Akira
2026-02-15 10:41:55 +09:00
parent ed899fb97d
commit 60dca6aab1
5 changed files with 381 additions and 77 deletions

View File

@@ -291,18 +291,19 @@ from apps.fields.models import Field
class Crop(models.Model): class Crop(models.Model):
"""作物マスタ""" """作物マスタ"""
name = models.CharField("作物名", max_length=50, unique=True) name = models.CharField("作物名", max_length=50, unique=True)
is_planting = models.BooleanField("作付けする", default=True) # is_planting フィールドは削除(「その他」で統一するため)
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
class Variety(models.Model): class Variety(models.Model):
"""品種マスタ""" """品種マスタ(すべての作物で統一)"""
crop = models.ForeignKey(Crop, on_delete=models.CASCADE, related_name='varieties') crop = models.ForeignKey(Crop, on_delete=models.CASCADE, related_name='varieties')
name = models.CharField("品種名", max_length=100) name = models.CharField("品種名", max_length=100)
class Meta: class Meta:
ordering = ['crop', 'name'] ordering = ['crop', 'name']
unique_together = [['crop', 'name']] # 同じ作物内で品種名は一意
class Plan(models.Model): class Plan(models.Model):
"""作付け計画""" """作付け計画"""
@@ -391,13 +392,60 @@ def import_yoshida_fields(request):
### Step 5: 作付け計画APIDay 5 ### Step 5: 作付け計画APIDay 5
#### 作物・品種の初期データ投入
**apps/plans/management/commands/init_crops.py**
```python
from django.core.management.base import BaseCommand
from apps.plans.models import Crop, Variety
class Command(BaseCommand):
help = '作物・品種マスタの初期データを投入'
def handle(self, *args, **options):
# 作物マスタと品種
crops_data = {
'': ['にこまる', 'たちはるか', 'たちはるか(特栽)'],
'トウモロコシ': [],
'エンドウ': ['久留米豊'],
'野菜': [],
'その他': [
'完全休耕',
'緑肥(ヘアリーベッチ)',
'緑肥(レンゲ)',
'景観作物(コスモス)',
'景観作物(ヒマワリ)'
]
}
for crop_name, varieties in crops_data.items():
crop, created = Crop.objects.get_or_create(name=crop_name)
if created:
self.stdout.write(f'作物「{crop_name}」を作成')
for variety_name in varieties:
variety, created = Variety.objects.get_or_create(
crop=crop,
name=variety_name
)
if created:
self.stdout.write(f' 品種「{variety_name}」を追加')
self.stdout.write(self.style.SUCCESS('初期データ投入完了'))
```
**実行:**
```bash
docker-compose exec backend python manage.py init_crops
```
#### apps/plans/views.py #### apps/plans/views.py
```python ```python
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.decorators import action from rest_framework.decorators import action, api_view
from rest_framework.response import Response from rest_framework.response import Response
from .models import Plan from .models import Plan, Crop, Variety
from .serializers import PlanSerializer from .serializers import PlanSerializer, CropSerializer, VarietySerializer
class PlanViewSet(viewsets.ModelViewSet): class PlanViewSet(viewsets.ModelViewSet):
queryset = Plan.objects.all() queryset = Plan.objects.all()
@@ -450,6 +498,79 @@ class PlanViewSet(viewsets.ModelViewSet):
) )
return Response({'status': 'success', 'copied': len(plans)}) return Response({'status': 'success', 'copied': len(plans)})
@action(detail=False, methods=['get'])
def summary(self, request):
"""集計(サイドバー用)"""
year = int(request.query_params.get('year'))
plans = Plan.objects.filter(year=year).select_related('crop', 'variety', 'field')
# 作物別集計
crop_summary = {}
total_area = 0
for plan in plans:
crop_name = plan.crop.name if plan.crop else '未設定'
variety_name = plan.variety.name if plan.variety else '(品種なし)'
area = plan.field.area_tan
total_area += area
if crop_name not in crop_summary:
crop_summary[crop_name] = {'total': 0, 'varieties': {}}
crop_summary[crop_name]['total'] += area
if variety_name not in crop_summary[crop_name]['varieties']:
crop_summary[crop_name]['varieties'][variety_name] = 0
crop_summary[crop_name]['varieties'][variety_name] += area
# 反を小数点1桁に丸める
for crop in crop_summary.values():
crop['total'] = round(crop['total'], 1)
for variety in crop['varieties']:
crop['varieties'][variety] = round(crop['varieties'][variety], 1)
return Response({
'total_area': round(total_area, 1),
'crops': crop_summary
})
@api_view(['POST'])
def add_variety(request):
"""新しい品種を追加"""
crop_id = request.data.get('crop_id')
name = request.data.get('name')
# 重複チェック
if Variety.objects.filter(crop_id=crop_id, name=name).exists():
return Response({'error': 'この品種は既に登録されています'}, status=400)
variety = Variety.objects.create(crop_id=crop_id, name=name)
return Response({
'id': variety.id,
'name': variety.name,
'crop_id': variety.crop_id
})
@api_view(['GET'])
def get_crops_with_varieties(request):
"""作物と品種の一覧を取得"""
crops = Crop.objects.prefetch_related('varieties').all()
data = []
for crop in crops:
data.append({
'id': crop.id,
'name': crop.name,
'varieties': [
{'id': v.id, 'name': v.name}
for v in crop.varieties.all()
]
})
return Response(data)
``` ```
### Step 6: 申請書PDF生成Day 7 ### Step 6: 申請書PDF生成Day 7
@@ -803,22 +924,43 @@ export default function ReportsPage() {
- **面積単位**: DB内部は全て `m2` で保存、表示時に `反` に変換 - **面積単位**: DB内部は全て `m2` で保存、表示時に `反` に変換
- **紐付けキー**: `raw_*` フィールドと外部キー `*_field` の両方を持つ - **紐付けキー**: `raw_*` フィールドと外部キー `*_field` の両方を持つ
- **ユニーク制約**: `(field, year)` で作付け計画は1つまで - **ユニーク制約**: `(field, year)` で作付け計画は1つまで
- **品種マスタ**: `(crop, name)` で一意制約
### 2. 申請書CSV生成 ### 2. 作物・品種の統一
- **すべての作物で品種選択UIは統一**: 作物による操作の違いなし
- **「作付けしない」系も特別扱いしない**: 「その他」という作物に統一
- **品種の追加**: その場で追加可能、データベースに永続化
- **初期データ**:
```
米: にこまる、たちはるか、たちはるか(特栽)
トウモロコシ: (ユーザーが追加)
エンドウ: 久留米豊
野菜: (ユーザーが追加)
その他: 完全休耕、緑肥(ヘアリーベッチ)、緑肥(レンゲ)、景観作物(コスモス)、景観作物(ヒマワリ)
```
### 3. 集計サイドバー
- **リアルタイム更新**: 作付け計画を保存するたびに自動更新
- **PC**: 開閉可能なサイドバー幅200px固定
- **スマホ**: モーダル表示
- **集計API**: `/api/plans/summary/?year=2025` で作物別・品種別の面積を返す
### 4. 申請書PDF生成
- **共済マスタをベースにループ**: 実圃場ベースではない - **共済マスタをベースにループ**: 実圃場ベースではない
- **作物の名寄せ**: Pythonのセットで重複排除 - **作物の名寄せ**: Pythonのセットで重複排除
- **未割当の扱い**: 「未設定」として出力 - **未割当の扱い**: 「未設定」として出力
### 3. UI/UX ### 5. UI/UX
- **未割当の強調**: 赤または黄色の背景色 - **未割当の強調**: 赤または黄色の背景色
- **スマホ対応**: 文字サイズ16px以上、タップ領域44px以上 - **スマホ対応**: 文字サイズ16px以上、タップ領域44px以上
- **検索のリアルタイム性**: `useState` + `filter` で実装 - **検索のリアルタイム性**: `useState` + `filter` で実装
- **品種追加のUI**: インライン入力、別画面に遷移しない
### 4. 認証 ### 6. 認証
- **JWT認証**: アクセストークン1日+ リフレッシュトークン7日 - **JWT認証**: アクセストークン1日+ リフレッシュトークン7日
- **シンプルな実装**: パスワードリセットはPhase 2 - **シンプルな実装**: パスワードリセットはPhase 2
### 5. パフォーマンス ### 7. パフォーマンス
- **Phase 1では最適化不要**: 圃場数39筆、共済31区画、中山間71区画 → 十分軽い - **Phase 1では最適化不要**: 圃場数39筆、共済31区画、中山間71区画 → 十分軽い
- **Phase 2で検討**: 栽培履歴が増えたらページネーション - **Phase 2で検討**: 栽培履歴が増えたらページネーション

View File

@@ -65,21 +65,34 @@ So that △△できる(目的・価値)
**【作物マスタ】** **【作物マスタ】**
``` ```
付けしない: 物リスト:
- 休耕
- 緑肥
- 景観作物
- その他野菜
作付けする:
- 米 - 米
└ 品種: にこまる、たちはるか、たちはるか(特栽)
- トウモロコシ - トウモロコシ
└ 品種: (毎年変わる→自由入力)
- エンドウ - エンドウ
└ 品種: 久留米豊
- 野菜 - 野菜
└ 品種: (増減あり→自由入力 - その他(休耕・緑肥・景観作物など
品種の登録方法:
- すべての作物で統一
- プリセット品種 + その場で追加
- 例:
┌─────────────────────────┐
│ 品種: [にこまる ▼] │
│ - にこまる │
│ - たちはるか │
│ - たちはるか(特栽)│
│ │
│ [+ 新しい品種を追加] │
└─────────────────────────┘
作物「その他」の品種例:
- 完全休耕
- 緑肥(ヘアリーベッチ)
- 緑肥(レンゲ)
- 景観作物(コスモス)
- 景観作物(ヒマワリ)
※「作付けしない」系も特別扱いせず、「その他」として統一
``` ```
--- ---

View File

@@ -179,28 +179,47 @@ ID 大字 字 地番 農地面積 作付け品目 交付金額
## 5. 作物マスタ ## 5. 作物マスタ
### 作付けしない ### 作物リスト
- 休耕 -
- 緑肥 - トウモロコシ
- 景観作物 - エンドウ
- その他野菜 - 野菜
- その他
### 作付けする ### 品種の登録方法
**すべての作物で統一されたUI:**
- プリセット品種から選択
- その場で新しい品種を追加可能
- 作物による操作の違いなし
### プリセット品種の例
#### 米 #### 米
- 品種:
- にこまる - にこまる
- たちはるか - たちはるか
- たちはるか(特栽) - たちはるか(特栽)
#### トウモロコシ #### トウモロコシ
- 品種: 自由入力(毎年変わるため - (ユーザーが追加
#### エンドウ #### エンドウ
- 品種: 久留米豊 - 久留米豊
#### 野菜 #### 野菜
- 品種: 自由入力(増減あり - (ユーザーが追加
#### その他
- 完全休耕
- 緑肥(ヘアリーベッチ)
- 緑肥(レンゲ)
- 景観作物(コスモス)
- 景観作物(ヒマワリ)
### 実装上の注意
- すべての作物で `Variety` テーブルに品種を登録
- 「作付けしない」系を特別扱いしない
- UIは完全に統一
--- ---

View File

@@ -110,28 +110,76 @@
### レイアウトPC ### レイアウトPC
``` ```
┌──────────────────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────────────────────
│ 🌾 Keina System > 作付け計画一覧 2025年度 ▼ 👤ログアウト │ │ 🌾 Keina System > 作付け計画一覧 2025年度 ▼ 👤ログアウト │
├──────────────────────────────────────────────────────────────┤ ├──────┬───────────────────────────────────────────────────────────┤
│ │ │
│ 📊 │ 🔍 [検索: 圃場名・住所_____________] 🔽絞込: [全て▼] │
│ 集計 │ │
│ │ ☐ 未割当のみ表示 [📋 前年度をコピー] [📊 申請書作成] │
│ ────────────────────────────────────────────────────────────────│
│ 米 │ No. ☐ 名称 住所 面積 作付 品種 操作 │
│15.3反│ ────────────────────────────────────────────────────────│
│┣にこ │ 1 ☐ おまけ 口神ノ川... 0.2反 米 にこまる [編集]│
││10.2反│ 2 ☐ 口神1反 口神ノ川... 1.2反 米 にこまる [編集]│
│┗たち │ 3 ☐ 口神北東 口神ノ川... 0.4反 野菜 トマト [編集]│
││5.1反│ 4 ☐ 口神北中 口神ノ川... 0.4反 ❗未設定 [割当]│
│ │ 5 ☐ 口神北西 口神ノ川... 0.5反 その他 完全休耕 [編集]│
│野菜 │ │
│3.2反 │ ... (39行) │
│ │ │
│その他│ ────────────────────────────────────────────────────────│
│1.5反 │ ページ: 1 / 2 表示件数: [25件▼] │
│ │ │
│未設定│ │
│2.0反❗ │
└──────┴───────────────────────────────────────────────────────────┘
```
**サイドバー(開閉可能):**
```
┌──────────────┐
│ [≡] 集計 │← トグルボタンで開閉
├──────────────┤
│ 合計 40.0反 │
│ │ │ │
🔍 [検索: 圃場名・住所_____________] 🔽絞込: [全て▼] [作物▼]
│ 15.3反 │
│ ├にこまる │
│ │ 10.2反 │
│ └たちはるか │
│ 5.1反 │
│ │ │ │
☐ 未割当のみ表示 [📋 前年度をコピー] [📊 申請書作成] 野菜
│ 3.2反 │
│ ├トマト │
│ │ 1.8反 │
│ └キュウリ │
│ 1.4反 │
│ │ │ │
├──────────────────────────────────────────────────────────────┤ │ トウモロコシ │
No. ☐ 名称 住所 面積 作付 品種 操作 2.5反
├──────────────────────────────────────────────────────────────┤
│ 1 ☐ おまけ 口神ノ川足川 351 0.2反 米 にこまる [編集]│
│ 2 ☐ 口神1反2畝 口神ノ川198... 1.2反 米 にこまる [編集]│
│ 3 ☐ 口神 北東 口神ノ川198... 0.4反 野菜 トマト [編集]│
│ 4 ☐ 口神 北中 口神ノ川198... 0.4反 ❗未設定 [割当]│
│ 5 ☐ 口神 北西 口神ノ川198... 0.5反 休耕 - [編集]│
│ │ │ │
... (39行) エンドウ
│ 1.8反 │
│ │ │ │
├──────────────────────────────────────────────────────────────┤ │ その他 │
ページ: 1 / 2 表示件数: [25件▼] 1.5反
└──────────────────────────────────────────────────────────────┘ │ ├完全休耕 │
│ │ 0.8反 │
│ └緑肥 │
│ 0.7反 │
│ │
│ ❗未設定 │
│ 2.0反 │
└──────────────┘
```
**サイドバー閉じた状態:**
```
┌───┐
│[☰]│← クリックで開く
└───┘
``` ```
### レイアウト(スマホ) ### レイアウト(スマホ)
@@ -141,6 +189,8 @@
│ 🌾 作付け計画 2025年度 ▼ ☰ │ │ 🌾 作付け計画 2025年度 ▼ ☰ │
├────────────────────────────────┤ ├────────────────────────────────┤
│ 🔍 [検索_______________] [🔽] │ │ 🔍 [検索_______________] [🔽] │
│ │
│ [📊 集計を表示] [前年度コピー]│← 集計はモーダル
├────────────────────────────────┤ ├────────────────────────────────┤
│ ┌────────────────────────────┐│ │ ┌────────────────────────────┐│
│ │ おまけ ││ │ │ おまけ ││
@@ -157,7 +207,36 @@
│ └────────────────────────────┘│ │ └────────────────────────────┘│
│ │ │ │
│ ... (39圃場) │ │ ... (39圃場) │
└────────────────────────────────┘
```
**スマホ: 集計モーダル**
```
┌────────────────────────────────┐
│ 集計 [×] │
├────────────────────────────────┤
│ │ │ │
│ 合計面積: 40.0反 │
│ │
│ 米: 15.3反 │
│ ├ にこまる: 10.2反 │
│ └ たちはるか: 5.1反 │
│ │
│ 野菜: 3.2反 │
│ ├ トマト: 1.8反 │
│ └ キュウリ: 1.4反 │
│ │
│ トウモロコシ: 2.5反 │
│ │
│ エンドウ: 1.8反 │
│ │
│ その他: 1.5反 │
│ ├ 完全休耕: 0.8反 │
│ └ 緑肥: 0.7反 │
│ │
│ ❗未設定: 2.0反 │
│ │
│ [閉じる] │
└────────────────────────────────┘ └────────────────────────────────┘
``` ```
@@ -185,11 +264,21 @@
- 前年度の作付けを全圃場にコピー - 前年度の作付けを全圃場にコピー
- [ ] [申請書作成]ボタン: - [ ] [申請書作成]ボタン:
- 画面6へ遷移 - 画面6へ遷移
- [ ] **集計サイドバーPC**:
- トグルボタンで開閉
- 作物別の合計面積
- 品種別の内訳(ツリー表示)
- 未設定の面積を警告表示
- [ ] **集計モーダル(スマホ)**:
- [📊 集計を表示]ボタンでモーダル表示
- PC版と同じ内容を縦スクロール表示
### デザインノート ### デザインノート
- **未割当の強調**: 赤または黄色の背景色 - **未割当の強調**: 赤または黄色の背景色
- **チェックボックスの位置**: 行の左端(スマホでも押しやすい) - **チェックボックスの位置**: 行の左端(スマホでも押しやすい)
- **スマホ版**: カード型レイアウト1圃場1カード - **スマホ版**: カード型レイアウト1圃場1カード
- **サイドバーの幅**: 200px固定
- **集計の更新**: 作付け計画を編集するたびにリアルタイム更新
--- ---
@@ -216,10 +305,14 @@
│ │ [米 ▼] ││ │ │ [米 ▼] ││
│ └────────────────────────────────┘│ │ └────────────────────────────────┘│
│ │ │ │
│ 品種 │ 品種 *
│ ┌────────────────────────────────┐│ │ ┌────────────────────────────────┐│
│ │ [にこまる ▼] ││ │ │ [にこまる ▼] ││
│ │ - にこまる ││
│ │ - たちはるか ││
│ │ - たちはるか(特栽) ││
│ └────────────────────────────────┘│ │ └────────────────────────────────┘│
│ [+ 新しい品種を追加] │
│ │ │ │
│ 備考 │ │ 備考 │
│ ┌────────────────────────────────┐│ │ ┌────────────────────────────────┐│
@@ -235,21 +328,15 @@
``` ```
┌────────────────────────────────────┐ ┌────────────────────────────────────┐
│ 作付けしない │
│ • 休耕 │
│ • 緑肥 │
│ • 景観作物 │
│ • その他野菜 │
│ │
│ 作付けする │
│ • 米 │ │ • 米 │
│ • トウモロコシ │ │ • トウモロコシ │
│ • エンドウ │ │ • エンドウ │
│ • 野菜 │ │ • 野菜 │
│ • その他 │
└────────────────────────────────────┘ └────────────────────────────────────┘
``` ```
### 品種選択(作物に応じて動的に変化 ### 品種選択(すべての作物で統一
**作物=「米」の場合:** **作物=「米」の場合:**
``` ```
@@ -257,36 +344,68 @@
│ • にこまる │ │ • にこまる │
│ • たちはるか │ │ • たちはるか │
│ • たちはるか(特栽) │ │ • たちはるか(特栽) │
• [その他: 自由入力_____________] ────────────────────────────────
│ [+ 新しい品種を追加] │
└────────────────────────────────────┘
クリックすると:
┌────────────────────────────────────┐
│ 新しい品種名を入力: │
│ [___________________________] │
│ │
│ [キャンセル] [追加] │
└────────────────────────────────────┘ └────────────────────────────────────┘
``` ```
**作物=「トウモロコシ」の場合:** **作物=「トウモロコシ」の場合:**
``` ```
┌────────────────────────────────────┐ ┌────────────────────────────────────┐
[自由入力_____________________] (まだ品種が登録されていません)
(品種は毎年変わるため) ────────────────────────────────
│ [+ 新しい品種を追加] │
└────────────────────────────────────┘ └────────────────────────────────────┘
``` ```
**作物=「休耕」などの場合:** **作物=「その他」の場合:**
``` ```
(品種選択フィールドは非表示) ┌────────────────────────────────────┐
│ • 完全休耕 │
│ • 緑肥(ヘアリーベッチ) │
│ • 緑肥(レンゲ) │
│ • 景観作物(コスモス) │
│ • 景観作物(ヒマワリ) │
│ ──────────────────────────────── │
│ [+ 新しい品種を追加] │
└────────────────────────────────────┘
``` ```
### 機能要件 ### 機能要件
- [ ] 作物をドロップダウンで選択 - [ ] 作物をドロップダウンで選択
- [ ] 作物に応じて品種選択が動的に変化 - [ ] **すべての作物で品種選択UIは統一**
- [ ] 「作付けしない」系の作物は、品種選択を非表示 - プリセット品種のドロップダウン
- [ ] 自由入力欄を用意(トウモロコシ、野菜など) - [+ 新しい品種を追加]ボタンは常に表示
- 作物による操作の違いなし
- [ ] 新しい品種の追加:
- [+ 新しい品種を追加]をクリック
- インライン入力フィールド表示
- 入力後、その場でプリセットに追加
- データベースに永続化(次回から選択可能)
- [ ] 備考欄(任意)
- [ ] [保存]ボタン → 作付け計画を保存して一覧に戻る - [ ] [保存]ボタン → 作付け計画を保存して一覧に戻る
- [ ] [キャンセル]ボタン → 変更を破棄して一覧に戻る - [ ] [キャンセル]ボタン → 変更を破棄して一覧に戻る
- [ ] **集計のリアルタイム更新**:
- 保存すると、サイドバーの集計が即座に更新される
### 一括割当の場合 ### 一括割当の場合
- モーダルのタイトルを「一括割当」に変更 - モーダルのタイトルを「一括割当」に変更
- 「圃場: 5件選択中」と表示 - 「圃場: 5件選択中」と表示
- 保存時、選択中の全圃場に同じ作付けを適用 - 保存時、選択中の全圃場に同じ作付けを適用
### デザインノート
- **UIの統一性**: どの作物を選んでも操作フローが同じ
- **品種の追加**: その場で追加できる(別画面に遷移しない)
- **プリセットの管理**: 一度追加した品種は、全ユーザーで共有(マスタ化)
--- ---
## 画面5: 圃場詳細(スマホ参照用) ## 画面5: 圃場詳細(スマホ参照用)

View File

@@ -85,11 +85,15 @@
**Day 5: 作付け計画API** **Day 5: 作付け計画API**
- [ ] Django: 作物・品種マスタの初期データ投入 - [ ] Django: 作物・品種マスタの初期データ投入
- 作物: 米、トウモロコシ、エンドウ、野菜、その他
- 品種: 米(にこまる等)、その他(完全休耕等)
- [ ] Django: 作付け計画API - [ ] Django: 作付け計画API
- 一覧取得 (`GET /api/plans/?year=2025`) - 一覧取得 (`GET /api/plans/?year=2025`)
- 作成・更新 (`POST /api/plans/`, `PATCH /api/plans/{id}/`) - 作成・更新 (`POST /api/plans/`, `PATCH /api/plans/{id}/`)
- 一括更新 (`POST /api/plans/bulk/`) - 一括更新 (`POST /api/plans/bulk/`)
- 前年度コピー (`POST /api/plans/copy_from_previous_year/`) - 前年度コピー (`POST /api/plans/copy_from_previous_year/`)
- **品種追加API** (`POST /api/varieties/`) - その場で品種を追加
- **集計API** (`GET /api/plans/summary/?year=2025`) - サイドバー用
- [ ] API動作確認 (Postman or curl) - [ ] API動作確認 (Postman or curl)
**Day 6: 作付け計画UI** **Day 6: 作付け計画UI**
@@ -97,9 +101,16 @@
- テーブル表示 - テーブル表示
- 検索・フィルタ機能 - 検索・フィルタ機能
- 未割当のハイライト - 未割当のハイライト
- **集計サイドバー(開閉可能)**
- 作物別・品種別の合計面積
- リアルタイム更新
- **スマホ: 集計モーダル表示**
- [ ] Next.js: 作付け計画編集モーダル - [ ] Next.js: 作付け計画編集モーダル
- 作物選択(ドロップダウン) - 作物選択(ドロップダウン)
- 品種選択(動的に変化) - **品種選択(統一UI**
- プリセット品種のドロップダウン
- [+ 新しい品種を追加]ボタン
- すべての作物で同じ操作
- 一括割当対応 - 一括割当対応
- [ ] Next.js: 前年度コピーボタン - [ ] Next.js: 前年度コピーボタン
- [ ] 動作確認: 作付け計画を実際に入力 - [ ] 動作確認: 作付け計画を実際に入力