作成: 2026-05-07
最終更新: 2026-05-29(数量単位をマスタ管理化)
対象機能: 野菜の播種・育苗・定植・栽培計画管理
実装状況: 設計確定 / 実装準備中
対象 Issue:akira/keinasystem#59
野菜栽培における播種、育苗、定植、および主力野菜向けの栽培計画を管理する機能。
ただし本機能は、水稲系機能のように「固定フローを前提にした一連管理」をそのまま持ち込むのではなく、以下のような現場運用の揺らぎを前提に設計する必要がある。
このドキュメントは、Issue #59 のインタビュー内容と設計判断を反映した、野菜栽培管理機能の実装前提ドキュメントである。
| IN(検討対象) | OUT(現時点では未確定 / 後回し) |
|---|---|
| 播種・育苗・定植の実績記録 | 収穫・販売管理の詳細仕様 |
| 直播きと育苗用播種の分岐管理 | 混植の厳密な空間モデリング |
| 主力野菜向けの栽培計画の考え方整理 | 畝・列・区画の完全構造化 |
| 育苗場所のマスタ化 | 育苗トレー単位の厳密在庫追跡 |
| 肥料・農薬を工程軸 / 場所軸の両方で捉える前提整理 | 品目別の換算ルール自動化 |
したがって、品目 -> ほ場 -> 播種 -> 定植 のような固定順序を前提にした入力フローは適合しにくい。
計画 / ToDo / 実績 の考え方は活かせる計画 / ToDo / 実績 という考え方はベースにできる現時点の仮説としては、野菜における各レイヤは次のように対応づけられる。
計画: 主力野菜向けの栽培計画、または播種計画 / 育苗計画 / 定植計画ToDo: 実施予定日が決まった作業、あるいは日々の作業管理対象実績: 播種 / 育苗 / 定植 / 施肥 / 防除など、実際に行った作業記録ただし、これは現時点では確定仕様ではなく、今後の設計議論で調整されうる。
未確定のまま始まるケースはあるが、最終的には少なくとも以下の情報はきっちり記録したい。
つまり、本機能には「最初は軽く始められる柔軟性」と「後で詳細を構造化して残せる厳密さ」の両立が必要である。
実装着手時に迷いやすい論点について、初期実装では以下を暫定方針として固定する。
apps.plans.Crop / Variety は、水稲前提の項目を持っている
seed_inventory_kgdefault_seedling_boxes_per_tanseed_materialVegetableCropVegetableVariety年度 を中心キーにしない播種日 / 育苗開始日 / 定植日 などの実日付とするyear を持つことは許容するが、意味は「代表日から自動設定される管理用年」にとどめる
sowing_date.yearstart_date.yeartransplant_date.yearyear は識別子や一意制約の中心に置かない栽培サイクルID や 親計画ID のような別軸で束ねるbackend/apps/vegetable_records とするVegetableCropVegetableVarietyVegetableSeedingRecordVegetableNurseryRecordVegetableTransplantRecordNurseryLocationVegetableQuantityUnit(数量単位マスタ)主力野菜では、単なる作業予定ではなく、以下のような栽培計画が必要になる。
主力野菜の計画粒度としては、少なくとも以下の両方が必要。
1つの栽培計画に対して、以下が複数件ぶら下がる構造が自然。
ただし、播種・育苗・定植は親計画に従属するだけでなく、それぞれ独立した管理単位としても扱いたい。
また、実績は親計画に紐づかない状態でも成立でき、計画が存在する場合のみ補助情報として関連づける考え方が適している。
播種量・育苗数量・定植数量の単位をコードにハードコードせず、ユーザーが自由に追加・管理できるようにする。
単位名を変更すると既存の全実績レコードに自動反映される。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name |
CharField(20) | ✓ | 単位名(例: g, ポット)— DBにはこのレコードへのFKが保存される |
unit_type |
CharField choices | ✓ | seeding(播種量)/ nursery(育苗数)/ transplant(定植数) |
is_active |
BooleanField | ✓ | 無効にするとフォームの選択肢から除外される |
display_order |
IntegerField | ✓ | 選択肢の表示順(昇順) |
unit_type の使い分け:
seeding: 播種フォームの「播種量単位」セレクトnursery: 育苗フォームの「数量単位」セレクトtransplant: 定植フォームの「定植数量単位」セレクト育苗と定植は単位が変わることがある(例: セルトレーで育苗 → 株で定植)ため、別プールとする。
VegetableSeedingRecord / VegetableNurseryRecord / VegetableTransplantRecord の quantity_unit フィールドは、VegetableQuantityUnit への ForeignKey(nullable)とする。
on_delete=PROTECT:使用中の単位は削除不可。無効化(is_active=False)で対応するGET /api/vegetable-records/quantity-units/?unit_type=seeding → 播種量単位一覧(is_active=true のみ)GET /api/vegetable-records/quantity-units/?unit_type=nursery → 育苗数単位一覧GET /api/vegetable-records/quantity-units/?unit_type=transplant → 定植数単位一覧seedingUnits / nurseryUnits / transplantUnits)unit_type で取得した先頭値をデフォルト選択とするunit_type は文脈から自動設定)FertilizationEntry.fertilizer と同様に PROTECT とする(CLAUDE.md 参照)。
初期実装で最優先で外したくないのは、播種・育苗・定植の実績を後追いでも記録できること である。
後追い実績入力の優先順位:
したがって、初期実装は主力野菜向けの高機能計画よりも、まず実績記録の成立を優先する。
数量 + 単位 を前提にした方がよい単位はコードにハードコードせず、VegetableQuantityUnit マスタで管理する。
ユーザーがマスタ画面から単位を追加・編集・無効化できる。
初期データとして以下を投入する(unit_type = seeding):
gkg粒穴トレーセルポット播種実績では、以下を最初から区別したい。
この区別は単なる種別ではなく、後続工程の有無を分岐させる重要な属性である。
通常の流れ:
播種 -> 育苗 -> 定植
直播き:
播種 の時点で、実質的に 定植まで終わった のと同じ扱いになる。
そのため、直播きの播種実績では、通常の播種項目に加えて以下を必須にしたい。
初期実装では、播種区分が 直播き の場合にのみ、これらの追加項目を表示・必須化する設計が自然。
VegetableQuantityUnit マスタで管理する(unit_type = nursery)初期データとして以下を投入する(unit_type = nursery):
株トレー苗箱セル初期実装の NurseryLocation マスタは、最低限以下の項目を持つ前提とする。
一方で、
定植数量の単位は VegetableQuantityUnit マスタで管理する(unit_type = transplant)。育苗実績とは別プール。育苗は「セル」「トレー」、定植は「株」「本」のように単位が変わることがあるため分離している。
初期データとして以下を投入する(unit_type = transplant):
株本トレー苗箱初期段階では、以下があれば十分。
初期実装の植え方種別は choice で持ち、候補は以下とする。
single_row(1条)multi_row(複数条)staggered(千鳥)other(その他)条数などのより厳密な構造化は、将来拡張として後回しにできる。
実績はそれぞれ単独で成立できることを前提とする。一方で、後から追跡しやすくするための任意 FK は持てるようにする。
初期実装の暫定方針:
VegetableNurseryRecord.seeding_record
VegetableSeedingRecord への nullable FKVegetableTransplantRecord.nursery_record
VegetableNurseryRecord への nullable FK直播きの場合は、VegetableSeedingRecord のみで実績が完結する前提とする。
この場合、VegetableNurseryRecord と VegetableTransplantRecord は作成しない。
この FK は存在すれば追跡補助に使うが、未設定でも実績は成立する。
計画との関係も同様に、将来必要になった時点で nullable FK による任意紐づけを基本とする。
肥料や農薬は、以下の両軸で扱いたい。
したがって、親計画に一括でぶら下げるだけでは不足する。
将来的には、工程別・場所別に関連づけつつ、横断的に集計できる構造が望ましい。
なお、初期実装で肥料・農薬をどの工程フォームに直接持たせるか、あるいは別機能で記録して紐づけるかは、まだ未確定である。
混植(同一ほ場に複数品目を植えること)は毎シーズン起こりうるため、データ構造上は阻害しない。
現時点の方針:
ただし、「このほ場に今何が植わっているか」を横断的に確認するほ場別ビューは初期実装に含めない。複数ほ場への同一品目の展開計画(例: トマトをほ場 A・B・C に作付けする計画)も将来の計画機能で対応する。
初期実装の UI は、docs/01_フロントエンドUIパターン.md に従って構成する。
播種・育苗・定植は、まず 1 ページ内で切り替えられる実績入力ハブとして実装する。
Navbar + max-w-7xl のメインコンテナを使う1ページ + タブ切り替え + 2カラム(一覧 + サイドパネルフォーム) を採用する野菜実績新規作成 ボタンマスタ管理 リンクボタン(/vegetable-records/masters へ遷移)補足説明文の例:
播種・育苗・定植の実績を後追いでも登録できますマスタ管理リンクは農薬散布ページの「農薬マスタ」ボタンと同じスタイルとする。
localStorage に vegetableRecordsYear キーで保存する1ページ内に以下のタブを置く。
播種育苗定植初期表示は 播種 とする。理由は、初期実装の優先順位が 播種 -> 育苗 -> 定植 であり、最初に最も入力需要が高い想定だからである。
2カラム(一覧 + サイドパネルフォーム) を使うプレースホルダーメッセージ例:
新規作成または一覧の編集から入力できます。各タブの一覧はテーブル表示を基本とする。
-未紐づけ右側フォームはタブごとに切り替える。フィールド数はまだ限定的なので、初期実装では別ページ遷移ではなくサイドパネルで十分とする。
共通入力項目:
播種区分が 直播き の場合に追加表示する項目:
UI 上の扱い:
播種区分 変更時に、直播き専用項目を表示・非表示する直播き の場合は、Nursery / Transplant に進まないことが分かる注意文をフォーム内に表示してよい作物名 / 品種名 の 2 段表示パターンに従うVegetableCrop のインライン追加を用意する
+ 作物を追加」ボタンを置き、クリックで名称のみのミニフォームを展開するVegetableVariety のインライン追加を用意する
+ 品種を追加」を表示する数量 と 単位 を 2 列グリッドで並べる育苗用播種 区分かつ同作物・同品種・同一年のレコードに絞る(直播きは候補に出さない)UI 上の扱い:
元播種実績 は任意選択であり、未選択でも保存できるVegetableCrop のインライン追加を用意するVegetableVariety のインライン追加を用意する
NurseryLocation マスタ選択とするNurseryLocation インライン追加を用意する
+ 育苗場所を追加」ボタンを置き、クリックでミニフォームを展開する/vegetable-records/masters に委ねるdocs/01_フロントエンドUIパターン.md の「フォーム入力を阻害しないマスタ補完」に従うUI 上の扱い:
数量 + 単位 で持つ元育苗実績 は任意選択であり、未選択でも保存できるVegetableCrop のインライン追加を用意するVegetableVariety のインライン追加を用意する
保存 -> 削除 -> 閉じる の順に並べる新規作成 は、現在選択中タブのフォームを新規状態で開く読み込み中... を表示するこの年度の記録はまだありません。 を表示するbg-emerald-50 でハイライトする/vegetable-records の単一ページを正面入口とする新規作成 や 編集 は別ページに遷移せず、その場でサイドパネルを開く/new や /[id]/edit への分離を検討する/vegetable-records/masters)ページヘッダーの「マスタ管理」リンクから遷移する専用ページ。
初期実装で管理する対象:
VegetableCrop(作物): 一覧・追加・編集・削除・有効フラグ切り替えVegetableVariety(品種): 一覧・追加・編集・削除・有効フラグ切り替えNurseryLocation(育苗場所): 一覧・追加・編集・削除・有効フラグ切り替えVegetableQuantityUnit(数量単位): 一覧・追加・編集・削除・有効フラグ切り替えフォーム内のインライン追加は「最低限必要な即時登録」に限定し、それ以外の操作はここに集約する。
VegetableCrop は名称のみVegetableVariety は選択中作物 + 名称のみNurseryLocation は名称 + 種別のみVegetableQuantityUnit はフォームからのインライン追加は行わず、マスタ画面のみで管理するページ左上には ChevronLeft + 戻る のバックナビゲーションを置き、/vegetable-records に戻れるようにする。
栽培計画から実績作成 を入れる場合も、別画面ではなく同一フォームに計画由来の初期値を流し込む形を基本とする現時点の整理から見ると、初期実装は次の順が現実的。
この段階では、
までは踏み込まず、まずは実績を失わず残せることを優先する。
akira/keinasystem#59docs/20_マスタードキュメント_浸種籾蒔き管理編.mddocs/21_マスタードキュメント_田植え実績編.mddocs/24_マスタードキュメント_畝建て作業編.md