作成: 2026-04-04
最終更新: 2026-05-15
対象機能: 田植え計画(年度・種子資材を軸に複数回作成できる苗箱・種もみ使用量計画)
実装状況: MVP実装完了
関連方針:docs/00_設計ポリシー_生産履歴中心設計.md
農業生産者が「年度 × 種子資材」を軸に、田植え前の播種・育苗準備量を見積もる機能。
各圃場について「実際に使う苗箱数」を記録し、計画全体で必要な種もみ量を自動集計する。
圃場候補は既存の作付け計画から自動取得し、選択した種子資材に紐づく品種を内部的に参照して候補圃場を決める。種もみ在庫は種子資材単位、反当苗箱枚数の初期値は紐づく品種単位で管理する。
同じ年度・同じ種子資材でも、播種時期や育苗ロットを分けるために複数の田植え計画を作成できる。
本機能は、生産履歴そのものの正本ではなく、実績入力と育苗準備を助ける作業仮説として扱う。
そのため、現場都合で中止・再計画・計画外実施が起きることを前提にし、後から「何が当初計画で、何が変更されたか」を追える設計を優先する。
| IN(実装済み) | OUT(対象外) |
|---|---|
| 田植え計画の作成・編集・削除 | 育苗日程のカレンダー管理 |
| 作付け計画からの候補圃場自動取得 | 実播種実績の記録 |
| 圃場ごとの苗箱数の個別調整 | 種もみロット管理 |
| 列単位のデフォルト反映・四捨五入 | 在庫の自動引当 |
| 苗箱合計・種もみkg合計の自動集計 | PDF出力 |
| 種子資材ごとの種もみ在庫参照 | 品種ごとの播種日管理 |
| 品種ごとの反当苗箱枚数デフォルト管理 | |
| 複数計画をまたぐ残計画の再配置(設計確定、#72) | サーバー側ドラフト保存 |
年度 × 種子資材 を軸に作成する反当苗箱枚数 を持ち、施肥計画の 反当袋数 と同じ役割で使う反当苗箱枚数 × 面積(反) を各圃場のデフォルト苗箱数として表示する苗箱数 であり、手動調整後の値をそのまま保持する種もみg/箱 は計画全体の共通パラメータとして扱い、圃場ごとには持たない計画名 で「第1回」「第2回」「4/10播種分」などを区別するデフォルト苗箱数 = 圃場面積(反) × 反当苗箱枚数
種もみkg = 苗箱数合計 × 苗箱1枚あたり種もみ(g) ÷ 1000
残在庫見込み = 種子資材在庫(kg) - 計画全体の種もみkg合計
既存 plans.Variety に以下を追加・参照する。
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| default_seedling_boxes_per_tan | decimal(6,2) | default=0 | 反当苗箱枚数の初期値 |
| seed_material | FK(materials.Material) 相当 | nullable | その品種に対応する種子在庫 |
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| id | int | PK | |
| name | varchar(200) | required | 計画名 |
| year | int | required | 年度 |
| variety | FK(plans.Variety) | PROTECT | 内部参照用の品種 |
| seedling_boxes_per_tan | decimal(6,2) | default=0 | 計画で使う反当苗箱枚数 |
| default_seed_grams_per_box | decimal(8,2) | default=0 | 苗箱1枚あたり種もみ(g)の初期値 |
| notes | text | blank | 備考 |
| created_at | datetime | auto | |
| updated_at | datetime | auto |
種子資材Variety を内部的に参照して保持するyear + variety の一意制約は持たない| 項目 | 型 | 説明 |
|---|---|---|
| field_count | int | 対象圃場数 |
| total_seedling_boxes | decimal | 苗箱数合計 |
| total_seed_kg | decimal | 種もみ使用量合計(kg) |
| variety_seed_inventory_kg | decimal | 種子資材在庫(kg) |
| remaining_seed_kg | decimal | 残在庫見込み(kg) |
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| id | int | PK | |
| plan | FK(RiceTransplantPlan) | CASCADE | |
| field | FK(fields.Field) | CASCADE | |
| installed_seedling_boxes | decimal(8,2) | required | その圃場の苗箱数 |
| status | varchar(20) | default=planned |
planned / canceled。当初計画を履歴付きで残すための状態 |
unique_together = ['plan', 'field']field__display_order, field__idcanceled の entry は履歴として残すが、苗箱合計・種もみ量合計・残在庫見込みの集計対象から除外する| 項目 | 型 | 説明 |
|---|---|---|
| field_name | string | 圃場名 |
| field_area_tan | decimal | 圃場面積(反) |
| default_seedling_boxes | decimal | 反当苗箱枚数 × 面積(反) で求めたデフォルト候補 |
| planned_boxes | decimal | 圃場ごとの苗箱数 |
すべて JWT 認証(Authorization: Bearer <token>)が必要。
| メソッド | URL | 説明 |
|---|---|---|
| GET | /api/plans/rice-transplant-plans/?year={year} |
年度別一覧 |
| POST | /api/plans/rice-transplant-plans/ |
新規作成 |
| GET | /api/plans/rice-transplant-plans/{id}/ |
詳細取得 |
| PUT/PATCH | /api/plans/rice-transplant-plans/{id}/ |
更新 |
| DELETE | /api/plans/rice-transplant-plans/{id}/ |
削除 |
| GET | /api/plans/rice-transplant-plans/candidate_fields/?year={year}&variety_id={id} |
内部参照した品種IDで候補圃場取得 |
一覧レスポンス例:
{
"id": 1,
"name": "2026年度 にこまる種もみ 田植え計画",
"year": 2026,
"variety": 3,
"variety_name": "にこまる",
"crop_name": "水稲",
"seedling_boxes_per_tan": "12.00",
"default_seed_grams_per_box": "200.00",
"seed_material_name": "にこまる 種もみ",
"notes": "",
"field_count": 8,
"total_seedling_boxes": "98.40",
"total_seed_kg": "19.680",
"variety_seed_inventory_kg": "25.000",
"remaining_seed_kg": "5.320",
"entries": [
{
"id": 10,
"field": 5,
"field_name": "田中上",
"field_area_tan": "1.2000",
"installed_seedling_boxes": "14.40",
"default_seedling_boxes": "14.40",
"planned_boxes": "14.40"
}
]
}
POST/PUT リクエスト例:
{
"name": "2026年度 にこまる種もみ 田植え計画",
"year": 2026,
"variety": 3,
"seedling_boxes_per_tan": "12.00",
"default_seed_grams_per_box": "200.00",
"notes": "",
"entries": [
{
"field_id": 5,
"installed_seedling_boxes": "14.40"
},
{
"field_id": 6,
"installed_seedling_boxes": "13.80"
}
]
}
更新時は entries の追加・更新・状態変更を扱う。
保存ペイロードに含まれなかった既存 entry を自動削除してはいけない。
田植え計画に必要な既定値は既存 API で更新する。
| メソッド | URL | 更新項目 |
|---|---|---|
| PATCH | /api/plans/varieties/{id}/ |
default_seedling_boxes_per_tan |
| PATCH | /api/plans/varieties/{id}/ |
seed_material または同等の種子在庫参照 |
| CRUD | /api/materials/materials/?material_type=seed |
種子在庫マスタ |
/rice-transplant/rice-transplant/new, /rice-transplant/{id}/edit2026年度 にこまる種もみ 第1回, 2026年度 にこまる種もみ 4/15播種分中止 状態で残す反当苗箱枚数 は紐づく品種マスタの default_seedling_boxes_per_tan を初期値として表示反当苗箱枚数 × 面積(反) で各圃場のデフォルト苗箱数を求める種もみg/箱 は計画全体の共通値計画中 / 中止反当苗箱枚数 の入力欄planned entry のみを集計対象とするIssue #72 では、単一計画編集とは別に「複数の田植え計画 + 未割り当て」を同時に扱う画面を追加する。
RiceTransplantPlan を横並び表示する反当苗箱数 × 面積(反) を初期値として再計算し、その後に手動微調整できるplanned / canceled の差分を一括保存する共通方針は docs/27_マスタードキュメント_計画横断調整編.md を参照。
中止 や再計画で整理する/allocation既存の作付け計画画面内の品種管理モーダルを拡張。
/materials/mastersmaterials.Material.name とするMaterial.name 正本化へ移行する設計を Issue #36 で管理するinstalled_seedling_boxes と seedling_boxes_per_tan は 0 以上の数値を想定Plan(作付け計画)であるため、先に作付け計画が必要ToDo や 田植え実績 から着手する導線は未整備Issue #61 では、苗不足が判明した後に通常の田植え計画と別に緊急対応を開始し、
受入圃場を後から選定して ToDo または 田植え実績 へ進める導線を追加予定である。
この拡張が入ると、田植え計画は唯一の作業起点ではなくなり、以下の役割に寄る。
移管済み / 中止 などの状態で整理される対象集合初期実装では、田植え計画エントリに少なくとも次の状態追加を想定する。
plannedcanceledmoved_to_emergency のような理由混じりの状態値は採用しない。
計画エントリ側では「今どういう状態か」だけを持ち、緊急対応や再配置といった文脈は別の参照情報として扱う。
田植え実績(RiceTransplantSession)は本計画(RiceTransplantPlan)に紐づけることができる。
実績画面での候補圃場抽出は以下の 2 モードで行う。
| モード | 条件 | 候補ルール |
|---|---|---|
| 計画選択時 | rice_transplant_plan あり |
計画の RiceTransplantEntry に含まれる圃場を初期選択状態で表示 |
| 計画未選択時 | rice_transplant_plan なし |
当年の Plan(crop.name="水稲")が存在する圃場を全件表示 |
詳細は docs/21_マスタードキュメント_田植え実績編.md を参照。
田植え実績と田植え計画の関係は次のように整理する。
planned / canceled の差分として整理するこの前提により、「当初どの計画だったか」と「最終的にどこへ植えたか」を混同せずに追える。
詳細は docs/27_マスタードキュメント_計画横断調整編.md を参照。
| 種別 | パス |
|---|---|
| モデル | backend/apps/plans/models.py |
| モデル | backend/apps/materials/models.py |
| シリアライザ | backend/apps/plans/serializers.py |
| シリアライザ | backend/apps/materials/serializers.py |
| ViewSet | backend/apps/plans/views.py |
| URL | backend/apps/plans/urls.py |
| マイグレーション | backend/apps/plans/migrations/0005_crop_seed_inventory_variety_seedling_boxes_and_rice_transplant.py, backend/apps/plans/migrations/0006_rename_seedling_boxes_per_tan_to_installed_seedling_boxes.py, backend/apps/plans/migrations/0007_ricetransplantplan_seedling_boxes_per_tan.py, backend/apps/plans/migrations/0008_variety_seed_material.py, backend/apps/plans/migrations/0009_alter_ricetransplantentry_installed_seedling_boxes.py, backend/apps/materials/migrations/0005_material_seed_type.py |
| 一覧画面 | frontend/src/app/rice-transplant/page.tsx |
| 編集画面 | frontend/src/app/rice-transplant/_components/RiceTransplantEditPage.tsx |
| ナビゲーション | frontend/src/components/Navbar.tsx |
| 品種管理モーダル | frontend/src/app/allocation/page.tsx |
| 在庫画面 | frontend/src/app/materials/page.tsx |
| 資材マスタ | frontend/src/app/materials/masters/page.tsx |