品種ごとの種子在庫前提まで実装を進めました。

主な変更は、seed 資材種別の追加と Variety.seed_material の導入です。backend/apps/materials/models.py、backend/apps/plans/models.py、backend/apps/plans/serializers.py で、田植え計画が作物在庫ではなく品種に紐づく種子資材の現在庫を参照するように切り替えました。マイグレーションは backend/apps/materials/migrations/0005_material_seed_type.py と backend/apps/plans/migrations/0008_variety_seed_material.py を追加しています。

画面側は、frontend/src/app/materials/page.tsx と frontend/src/app/materials/masters/page.tsx に「種子」タブを追加し、frontend/src/app/allocation/page.tsx の品種管理モーダルで品種ごとに種子在庫資材を設定できるようにしました。田植え計画画面 frontend/src/app/rice-transplant/_components/RiceTransplantEditPage.tsx も、苗箱数 列中心に整理し、種もみkg 列を削除、反当苗箱枚数 の列反映と ≈ / ↩ の四捨五入トグルを施肥計画寄りの操作感に寄せています。仕様書 document/16_マスタードキュメント_田植え計画編.md も更新済みです。

確認できたのは python3 -m py_compile backend/apps/materials/models.py backend/apps/materials/serializers.py backend/apps/plans/models.py backend/apps/plans/serializers.py backend/apps/plans/views.py までです。frontend/node_modules が無いためフロントのビルド確認はまだできていません。Issue #2 にも反映内容をコメント済みです。必要なら次にコミットします。
This commit is contained in:
akira
2026-04-05 11:22:07 +09:00
parent 11b36b28a5
commit a38472e4a0
14 changed files with 473 additions and 236 deletions

View File

@@ -12,7 +12,7 @@
農業生産者が「年度 × 品種」を軸に、田植え前の播種・育苗準備量を見積もる機能。
各圃場について「実際に使う苗箱数」を記録し、計画全体で必要な種もみ量を自動集計する。
圃場候補は既存の作付け計画から自動取得し、種もみ在庫は作物単位、反当苗箱枚数の初期値品種単位で管理する。
圃場候補は既存の作付け計画から自動取得し、種もみ在庫は品種単位、反当苗箱枚数の初期値品種単位で管理する。
同じ年度・同じ品種でも、播種時期や育苗ロットを分けるために複数の田植え計画を作成できる。
### 機能スコープIN / OUT
@@ -24,7 +24,7 @@
| 圃場ごとの苗箱数の個別調整 | 種もみロット管理 |
| 列単位のデフォルト反映・四捨五入 | 在庫の自動引当 |
| 苗箱合計・種もみkg合計の自動集計 | PDF出力 |
| 作物ごとの種もみ在庫kg管理 | 品種ごとの播種日管理 |
| 品種ごとの種もみ在庫参照 | 品種ごとの播種日管理 |
| 品種ごとの反当苗箱枚数デフォルト管理 | |
---
@@ -33,7 +33,7 @@
1. 田植え計画は `年度 × 品種` を軸に作成する
2. 対象圃場は、その年度・品種の作付け計画が登録されている圃場から取得する
3. 種もみ在庫は作物単位で管理する
3. 種もみ在庫は品種単位で管理する
4. 反当苗箱枚数の初期値は品種単位で管理する
5. 計画ヘッダ側に `反当苗箱枚数` を持ち、施肥計画の `反当袋数` と同じ役割で使う
6. 画面上では `反当苗箱枚数 × 面積(反)` を各圃場のデフォルト苗箱数として表示する
@@ -57,27 +57,20 @@
### 計画全体の残在庫見込み
`残在庫見込み = 作物の種もみ在庫(kg) - 計画全体の種もみkg合計`
`残在庫見込み = 品種の種もみ在庫(kg) - 計画全体の種もみkg合計`
---
## データモデル
### Crop作物マスタ
既存 `plans.Crop` に以下を追加。
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| seed_inventory_kg | decimal(10,3) | default=0 | 作物単位の種もみ在庫(kg) |
### Variety品種マスタ
既存 `plans.Variety` に以下を追加。
既存 `plans.Variety` に以下を追加・参照する
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| default_seedling_boxes_per_tan | decimal(6,2) | default=0 | 反当苗箱枚数の初期値 |
| seed_material | FK(materials.Material) 相当 | nullable | その品種に対応する種子在庫 |
### RiceTransplantPlan田植え計画
@@ -103,7 +96,7 @@
| field_count | int | 対象圃場数 |
| total_seedling_boxes | decimal | 苗箱数合計 |
| total_seed_kg | decimal | 種もみ使用量合計(kg) |
| crop_seed_inventory_kg | decimal | 作物在庫(kg) |
| variety_seed_inventory_kg | decimal | 品種在庫(kg) |
| remaining_seed_kg | decimal | 残在庫見込み(kg) |
### RiceTransplantEntry田植え計画エントリ
@@ -126,7 +119,6 @@
| field_area_tan | decimal | 圃場面積(反) |
| default_seedling_boxes | decimal | `反当苗箱枚数 × 面積(反)` で求めたデフォルト候補 |
| planned_boxes | decimal | 圃場ごとの苗箱数 |
| planned_seed_kg | decimal | 圃場ごとの必要種もみkg |
---
@@ -157,11 +149,12 @@
"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",
"crop_seed_inventory_kg": "25.000",
"variety_seed_inventory_kg": "25.000",
"remaining_seed_kg": "5.320",
"entries": [
{
@@ -171,8 +164,7 @@
"field_area_tan": "1.2000",
"installed_seedling_boxes": "14.40",
"default_seedling_boxes": "14.40",
"planned_boxes": "14.40",
"planned_seed_kg": "2.880"
"planned_boxes": "14.40"
}
]
}
@@ -203,14 +195,15 @@ POST/PUT リクエスト例:
更新時は `entries` を全置換する。
### 作物・品種マスタ更新
### 品種マスタ更新 / 在庫管理
田植え計画に必要な既定値は既存 API で更新する。
| メソッド | URL | 更新項目 |
|---|---|---|
| PATCH | `/api/plans/crops/{id}/` | `seed_inventory_kg` |
| PATCH | `/api/plans/varieties/{id}/` | `default_seedling_boxes_per_tan` |
| PATCH | `/api/plans/varieties/{id}/` | `seed_material` または同等の種子在庫参照 |
| CRUD | `/api/materials/materials/?material_type=seed` | 品種別の種子在庫マスタ |
---
@@ -255,26 +248,26 @@ POST/PUT リクエスト例:
- 面積(反)
- 苗箱数入力欄
- 左側にデフォルト苗箱数ラベルを表示
- 必要種もみkg
- 小数は 1 桁表示を基本とする
- 列操作:
- `反当苗箱枚数` の入力欄
- デフォルトを列単位で一括反映するボタン
- 列単位の四捨五入ボタン
- 施肥計画の四捨五入ボタンと同じ配置・2ステート動作
- サマリー:
- 対象圃場数
- 苗箱合計
- 種もみ計画kg
- 作物在庫kg
- 品種在庫kg
- 残在庫見込みkg
### 3. 品種管理モーダル `/allocation`
既存の作付け計画画面内の品種管理モーダルを拡張。
- 作物単位:
- 種もみ在庫(kg) を更新可能
- 品種単位:
- 反当苗箱枚数デフォルトを更新可能
- 対応する種子在庫を設定可能
---
@@ -291,10 +284,8 @@ POST/PUT リクエスト例:
## 既知の制約
1. 種もみ在庫は作物単位のみで、品種別在庫には未対応
2. 田植え計画の PDF 出力は未実装
3. 在庫管理 `materials` app とは未連携で、引当・使用実績は持たない
4. 実播種や田植え実績との連携は未実装
1. 田植え計画の PDF 出力は未実装
2. 実播種や田植え実績との連携は未実装
---
@@ -303,11 +294,15 @@ POST/PUT リクエスト例:
| 種別 | パス |
|---|---|
| モデル | `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/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/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` |