作成: 2026-04-17
最終更新: 2026-05-11
対象機能: 浸種・籾蒔き実績記録
実装状況: 仕様検討中
Gitea Issue: akira/keinasystem#26
関連方針:docs/00_設計ポリシー_生産履歴中心設計.md
田植え前の育苗準備工程(浸種・籾蒔き)の実績を記録する機能。
田植え計画(#16)で算出した苗箱枚数・種もみ量の計画に対して、実際に行った作業の記録を残す。
本機能は、田植え計画の付属機能ではなく、生産履歴を成立させるための独立した実績記録として扱う。
田植え計画と一致しない浸種量・播種量であっても、実際に行った内容を正本として残せることを優先する。
| IN(実装対象) | OUT(対象外) |
|---|---|
| 浸種実績の記録(品種・日付・種もみ量・消毒方法) | 育苗日程のカレンダー管理 |
| 籾蒔き実績の記録(品種・日付・種もみ量・苗箱数・育苗方法) | 育苗中の生育記録 |
| 浸種と籾蒔きの紐付け | 在庫の自動引当 |
| 農薬消毒時の散布記録(SprayEvent)との連携 | PDF出力 |
| 使用資材の記録 | 育苗コスト管理 |
date.year)apps/pesticide の SprayEvent(target_type=seed_treatment)として別途記録し、そのレコードに紐付けるMaterial マスタから選択するアプリ: apps/nursery
テーブル名: nursery_seedsoaking
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| id | BigAutoField | PK | |
| year | IntegerField | required | 年度(start_date.year から自動設定) |
| variety | FK(plans.Variety) | PROTECT | 品種 |
| start_date | DateField | required | 浸種開始日 |
| end_date | DateField | null=True | 浸種終了日(後から記録) |
| seed_weight_kg | DecimalField(8,3) | required | 種もみ量(kg) |
| disinfection_method | CharField(20) | required | 消毒方法(下記 choices) |
| spray_event | FK(pesticide.SprayEvent) | null=True, SET_NULL | 農薬消毒の場合の散布記録 |
| notes | TextField | blank | 備考 |
| created_at | DateTimeField | auto | |
| updated_at | DateTimeField | auto |
disinfection_method choices:
| 値 | 表示名 |
|---|---|
hot_water |
温湯消毒 |
pesticide |
農薬消毒 |
none |
消毒なし |
other |
その他 |
disinfection_method=pesticide のとき spray_event は任意(null でも保存可。後から紐付け推奨)disinfection_method != pesticide のとき spray_event は null を推奨(設定してもエラーにはしない)spray_event を設定する場合、spray_event.target_type=seed_treatment かつ spray_event.target_variety == variety かつ spray_event.year == year であること(APIバリデーション)テーブル名: nursery_seedsoakingmaterial
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| id | BigAutoField | PK | |
| soaking | FK(SeedSoaking) | CASCADE | |
| material | FK(materials.Material) | PROTECT | |
| amount | CharField(50) | blank | 使用量(例: 500mL、単位込み自由記述) |
unique_together = ['soaking', 'material']テーブル名: nursery_seedsowing
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| id | BigAutoField | PK | |
| year | IntegerField | required | 年度(sow_date.year から自動設定) |
| soaking | FK(SeedSoaking) | null=True, SET_NULL | 紐づく浸種記録(任意) |
| variety | FK(plans.Variety) | PROTECT | 品種 |
| sow_date | DateField | required | 播種日 |
| seed_weight_kg | DecimalField(8,3) | required | 使用種もみ量(kg) |
| seedling_boxes | DecimalField(8,1) | required | 苗箱数(枚) |
| nursery_method | CharField(20) | required | 育苗方法(下記 choices) |
| nursery_method_note | CharField(200) | blank | 育苗方法の補足(その他の場合の内容等) |
| notes | TextField | blank | 備考 |
| created_at | DateTimeField | auto | |
| updated_at | DateTimeField | auto |
nursery_method choices:
| 値 | 表示名 |
|---|---|
pool |
プール育苗 |
tunnel |
トンネル苗代 |
other |
その他 |
soaking が設定されている場合、soaking.variety == variety であること(バリデーション)soaking が設定されている場合、soaking.year == year であること(バリデーション)SeedSoaking SeedSowing から田植え実績へ連鎖できることが望ましいテーブル名: nursery_seedsowingmaterial
| フィールド | 型 | 制約 | 説明 |
|---|---|---|---|
| id | BigAutoField | PK | |
| sowing | FK(SeedSowing) | CASCADE | |
| material | FK(materials.Material) | PROTECT | |
| amount | CharField(50) | blank | 使用量(例: 1袋、単位込み自由記述) |
unique_together = ['sowing', 'material']すべて JWT 認証(Authorization: Bearer <token>)が必要。
| メソッド | URL | 説明 |
|---|---|---|
| GET | /api/nursery/soakings/?year={year} |
年度別一覧 |
| POST | /api/nursery/soakings/ |
新規作成 |
| GET | /api/nursery/soakings/{id}/ |
詳細取得 |
| PUT/PATCH | /api/nursery/soakings/{id}/ |
更新 |
| DELETE | /api/nursery/soakings/{id}/ |
削除 |
浸種記録 レスポンス例:
{
"id": 1,
"year": 2026,
"variety": 3,
"variety_name": "にこまる",
"crop_name": "水稲",
"start_date": "2026-04-20",
"end_date": null,
"seed_weight_kg": "10.000",
"disinfection_method": "hot_water",
"disinfection_method_display": "温湯消毒",
"spray_event": null,
"materials": [
{
"id": 1,
"material": 5,
"material_name": "温湯消毒用資材",
"amount": "1袋"
}
],
"sowing_count": 2,
"warnings": [],
"notes": "",
"created_at": "2026-04-17T10:00:00Z",
"updated_at": "2026-04-17T10:00:00Z"
}
disinfection_method=pesticide かつ spray_event=null の場合は保存をブロックせず、レスポンスの warnings に 農薬消毒ですが、農薬散布記録が未設定です。後から紐付けてください。 を含める。
POST/PUT リクエスト例:
{
"variety": 3,
"start_date": "2026-04-20",
"end_date": null,
"seed_weight_kg": "10.000",
"disinfection_method": "hot_water",
"spray_event": null,
"materials": [
{ "material": 5, "amount": "1袋" }
],
"notes": ""
}
| メソッド | URL | 説明 |
|---|---|---|
| GET | /api/nursery/sowings/?year={year} |
年度別一覧 |
| POST | /api/nursery/sowings/ |
新規作成 |
| GET | /api/nursery/sowings/{id}/ |
詳細取得 |
| PUT/PATCH | /api/nursery/sowings/{id}/ |
更新 |
| DELETE | /api/nursery/sowings/{id}/ |
削除 |
籾蒔き記録 レスポンス例:
{
"id": 1,
"year": 2026,
"soaking": 1,
"soaking_start_date": "2026-04-20",
"variety": 3,
"variety_name": "にこまる",
"crop_name": "水稲",
"sow_date": "2026-04-25",
"seed_weight_kg": "5.000",
"seedling_boxes": "60.0",
"nursery_method": "pool",
"nursery_method_display": "プール育苗",
"nursery_method_note": "",
"materials": [
{
"id": 1,
"material": 7,
"material_name": "育苗培土",
"amount": "30袋"
}
],
"notes": "",
"created_at": "2026-04-17T10:00:00Z",
"updated_at": "2026-04-17T10:00:00Z"
}
/nurseryナビゲーション配置: 実績グループ
/nursery/soaking/new, /nursery/soaking/{id}/edit/nursery/sowing/new, /nursery/sowing/{id}/editdisinfection_method=pesticide かつ spray_event=null の場合は保存可(後から紐付け推奨、ブロックしない)。APIレスポンスの warnings に未紐付け警告を返すspray_event を設定する場合、spray_event.target_type=seed_treatment かつ spray_event.target_variety==SeedSoaking.variety かつ spray_event.year==SeedSoaking.year でなければ API エラー(400)soaking FK が設定されている場合、品種・年度が一致しない場合はエラーapps/nursery を作成: 浸種・籾蒔きは既存アプリ(plans / fertilizer)と性質が異なるため独立アプリとするtarget_type=variety は作付け計画から全圃場の SprayEventResolvedField を生成するため、圃場の概念を持たない浸種消毒には不適切。seed_treatment を使うことで圃場スナップショット生成をスキップし、データの意味的な正確さを保つ。SeedSoaking 側に FK を持つ。other で対応)| 種別 | パス |
|---|---|
| モデル | backend/apps/nursery/models.py |
| シリアライザ | backend/apps/nursery/serializers.py |
| ViewSet | backend/apps/nursery/views.py |
| URL | backend/apps/nursery/urls.py |
| 一覧画面 | frontend/src/app/nursery/page.tsx |
| 編集画面(浸種) | frontend/src/app/nursery/_components/SeedSoakingEditPage.tsx |
| 編集画面(籾蒔き) | frontend/src/app/nursery/_components/SeedSowingEditPage.tsx |
| 型定義 | frontend/src/lib/types.ts |