📚 修正したドキュメント
✅ 02_ユーザーストーリー.md - 作物マスタの定義を統一 ✅ 03_データ仕様書.md - 作物・品種マスタを更新 ✅ 04_画面設計書.md - 集計サイドバーと編集モーダルのUI ✅ 05_実装優先順位.md - Day 5-6に集計API・品種追加APIを追加 ✅ 06_Gemini向け統合指示書.md - コード例を全面更新
This commit is contained in:
@@ -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: 作付け計画API(Day 5)
|
### Step 5: 作付け計画API(Day 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で検討**: 栽培履歴が増えたらページネーション
|
||||||
|
|
||||||
|
|||||||
@@ -65,21 +65,34 @@ So that △△できる(目的・価値)
|
|||||||
|
|
||||||
**【作物マスタ】**
|
**【作物マスタ】**
|
||||||
```
|
```
|
||||||
作付けしない:
|
作物リスト:
|
||||||
- 休耕
|
|
||||||
- 緑肥
|
|
||||||
- 景観作物
|
|
||||||
- その他野菜
|
|
||||||
|
|
||||||
作付けする:
|
|
||||||
- 米
|
- 米
|
||||||
└ 品種: にこまる、たちはるか、たちはるか(特栽)
|
|
||||||
- トウモロコシ
|
- トウモロコシ
|
||||||
└ 品種: (毎年変わる→自由入力)
|
|
||||||
- エンドウ
|
- エンドウ
|
||||||
└ 品種: 久留米豊
|
|
||||||
- 野菜
|
- 野菜
|
||||||
└ 品種: (増減あり→自由入力)
|
- その他(休耕・緑肥・景観作物など)
|
||||||
|
|
||||||
|
品種の登録方法:
|
||||||
|
- すべての作物で統一
|
||||||
|
- プリセット品種 + その場で追加
|
||||||
|
- 例:
|
||||||
|
┌─────────────────────────┐
|
||||||
|
│ 品種: [にこまる ▼] │
|
||||||
|
│ - にこまる │
|
||||||
|
│ - たちはるか │
|
||||||
|
│ - たちはるか(特栽)│
|
||||||
|
│ │
|
||||||
|
│ [+ 新しい品種を追加] │
|
||||||
|
└─────────────────────────┘
|
||||||
|
|
||||||
|
作物「その他」の品種例:
|
||||||
|
- 完全休耕
|
||||||
|
- 緑肥(ヘアリーベッチ)
|
||||||
|
- 緑肥(レンゲ)
|
||||||
|
- 景観作物(コスモス)
|
||||||
|
- 景観作物(ヒマワリ)
|
||||||
|
|
||||||
|
※「作付けしない」系も特別扱いせず、「その他」として統一
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
39
03_データ仕様書.md
39
03_データ仕様書.md
@@ -179,28 +179,47 @@ ID 大字 字 地番 農地面積 作付け品目 交付金額
|
|||||||
|
|
||||||
## 5. 作物マスタ
|
## 5. 作物マスタ
|
||||||
|
|
||||||
### 作付けしない
|
### 作物リスト
|
||||||
- 休耕
|
- 米
|
||||||
- 緑肥
|
- トウモロコシ
|
||||||
- 景観作物
|
- エンドウ
|
||||||
- その他野菜
|
- 野菜
|
||||||
|
- その他
|
||||||
|
|
||||||
### 作付けする
|
### 品種の登録方法
|
||||||
|
|
||||||
|
**すべての作物で統一されたUI:**
|
||||||
|
- プリセット品種から選択
|
||||||
|
- その場で新しい品種を追加可能
|
||||||
|
- 作物による操作の違いなし
|
||||||
|
|
||||||
|
### プリセット品種の例
|
||||||
|
|
||||||
#### 米
|
#### 米
|
||||||
- 品種:
|
|
||||||
- にこまる
|
- にこまる
|
||||||
- たちはるか
|
- たちはるか
|
||||||
- たちはるか(特栽)
|
- たちはるか(特栽)
|
||||||
|
|
||||||
#### トウモロコシ
|
#### トウモロコシ
|
||||||
- 品種: 自由入力(毎年変わるため)
|
- (ユーザーが追加)
|
||||||
|
|
||||||
#### エンドウ
|
#### エンドウ
|
||||||
- 品種: 久留米豊
|
- 久留米豊
|
||||||
|
|
||||||
#### 野菜
|
#### 野菜
|
||||||
- 品種: 自由入力(増減あり)
|
- (ユーザーが追加)
|
||||||
|
|
||||||
|
#### その他
|
||||||
|
- 完全休耕
|
||||||
|
- 緑肥(ヘアリーベッチ)
|
||||||
|
- 緑肥(レンゲ)
|
||||||
|
- 景観作物(コスモス)
|
||||||
|
- 景観作物(ヒマワリ)
|
||||||
|
|
||||||
|
### 実装上の注意
|
||||||
|
- すべての作物で `Variety` テーブルに品種を登録
|
||||||
|
- 「作付けしない」系を特別扱いしない
|
||||||
|
- UIは完全に統一
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
185
04_画面設計書.md
185
04_画面設計書.md
@@ -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: 圃場詳細(スマホ参照用)
|
||||||
|
|||||||
13
05_実装優先順位.md
13
05_実装優先順位.md
@@ -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: 前年度コピーボタン
|
||||||
- [ ] 動作確認: 作付け計画を実際に入力
|
- [ ] 動作確認: 作付け計画を実際に入力
|
||||||
|
|||||||
Reference in New Issue
Block a user