計画始動後の作付け変更について #3
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
現在の状態(なぜOpenか)
調査開始
次にすること(Next Action)
影響範囲を調査する
ブロック要因
(なければ「なし」)
問題の概要
今、
ここで
作付け計画、施肥計画、散布実績などが、既にわりついているので
作付け計画に戻って一部だけ変えるというのが困難な状況になっている。
だが、現実には、そのような変更は必要
A) 既に、散布した肥料や農薬などは、そのまま紐づいていなければならない
B) 作付け計画を変えるので、品種は変わる
C) グループも変える
ちょっと操作した感じでは、少なくとも
1.足川北上を「にこまる」から「たちはるか特栽」に変えた
2.施肥計画画面の圃場追加候補に足川北上が出てこない
のような状況です。
たぶん、この問題だけ解決しても、他にも色々不具合が出てくると思います。
よって、
1) 最初に、これを実現する為に明らかになっていなければいけない事は何かを明示する
2) この実現によって、影響を受ける仕様を具体化する
の作業を行ってください
再現手順
期待する動作
実際の動作
関連
確認内容の整理
項目 | 決定事項 -- | -- ① 変更履歴 | 必要(なぜ施肥設計が変わったか後からわかるように) ② 散布済みEntry | (B) 新品種計画に移動(影響大なら(A)も可) ③ 未散布Entry | 新品種計画に移動 + RESERVE付け替え ④ グループ | 圃場固有の恒久属性のため対応不要 ⑤ 田植え計画 | 施肥計画と同様の対処が必要どれが良いですか?
実装の進め方(提案)
影響が広いため、段階的な実装を提案します:
PlanVarietyChangeモデル追加(履歴記録のみ、表示なし)Step 2 が一番リスクが高い(RESERVE付け替えがある)ため、Step 1 で履歴だけ入れて動作確認後に Step 2 に進む方が安全です。
進め方についても確認させてください。
</html>CODEX
Issue #3 調査メモ: 計画始動後の作付け変更について
対象 issue
#3計画始動後の作付け変更について1. まず明らかになっている必要があること
この課題は「作付け計画を変更したい」ではなく、
「すでに計画・運搬・散布の一部が動き始めた後で、将来分だけを安全に組み替えたい」が本質。
そのため、以下を仕様として先に決めないと実装を始めると破綻しやすい。
1-1. どこまでを履歴として固定し、どこから先を変更対象にするか
圃場 × 肥料は履歴として固定するのか1-2. 品種変更を何の単位で許可するか
1-3. グループ変更の意味
ユーザー確認により、issue 本文の「グループ変更」は主に圃場管理の
group_nameを指す。group_nameは後から変更されうるこのため、少なくとも以下を分けて考える必要がある。
1-4. 不整合をどこまで許容するか
1-5. ユーザー操作として必要な単位
2. 現行実装で起きていること
2-1. 候補圃場は「現在の作付け計画」から再計算される
施肥計画の圃場候補は、現在の
plans.Plan(year, variety)を見て作られている。そのため、作付け計画で圃場の品種を変更すると、
変更前の品種に紐づく施肥計画画面では、その圃場が追加候補に出なくなる。
issue にある「足川北上が圃場追加候補に出てこない」はこの挙動と一致する。
2-2. 施肥計画の実績集計は
year + field + fertilizer単位散布実績から
actual_bagsを再集計するとき、対象はplan__year + field_id + fertilizer_idで更新される。つまり現行実装では、
「どの施肥計画に対する実績か」ではなく、
「同年度のその圃場・その肥料の実績か」で紐づいている。
このため、同じ年度に圃場を別計画へ移したり、計画を分割したりすると、
実績が複数計画へ二重反映または意図しない再配分になる余地がある。
2-3. 施肥計画更新はエントリ全削除・全再作成
施肥計画更新時は、既存エントリを全削除して新しいエントリを作り直す。
この方式だと、「散布済みの行だけ残して、未散布分だけ移す」という操作単位を持てない。
履歴保持と将来計画の分離を実現するには、今の更新方式は不足している。
2-4. 運搬計画は年度内の全施肥エントリを前提に集計する
運搬計画詳細の未割当圃場・利用可能肥料・全明細は、
plan__year=obj.yearの全施肥エントリから作られている。そのため、作付け変更に伴って施肥計画を分割・移管したい場合、
年度全体集計ベースの画面は旧計画と新計画を自然に区別できない。
2-5. 散布実績自体はスナップショットを保持している
散布実績明細は以下を保存している。
実散布袋数
計画袋数スナップショット
運搬済み袋数スナップショット
backend/apps/fertilizer/models.py
backend/apps/fertilizer/serializers.py
これは履歴保持の観点では良いが、
「どの施肥計画のどの行から発生した散布か」という計画レベルの参照は保持していない。
3. 影響を受ける仕様
3-1. 作付け計画
field + yearが 1 件で、その年度の最新状態のみを表す3-2. 施肥計画
actual_bagsの再集計単位3-3. 圃場グループ
group_nameは現在値しか持っていないgroup_nameに直接依存している箇所は薄い3-4. 運搬計画
3-5. 散布実績
3-6. 在庫管理
3-7. 作業記録
4. この issue に対する現時点の結論
この問題は単なる「候補圃場の表示漏れ」ではない。
本質は以下の 2 点。
年度 + 圃場 + 肥料集計でつながっており、計画の再編単位を持っていないしたがって、候補圃場 API だけ直しても不十分で、
少なくとも「履歴固定」と「未実施分の再計画」の仕様分離が必要。
5. 実装前に必要な仕様決定
最低限、次の 4 点を決める必要がある。
group_name変更を履歴管理対象にするか、現在値扱いに留めるか6. 推奨する実装方針の方向性
現時点では、次の方向が最も安全に見える。
方針A: 履歴固定 + 未実施分の再計画
圃場 × 肥料は旧施肥計画側に固定するgroup_nameは変更可能な現在属性として扱い、必要なら帳票側でスナップショット化を検討する方針B: 候補圃場と実績参照を分離する
plan_idまたはそれに準ずる固定キーに寄せる方針A/B を組み合わせないと、issue の A/B/C を同時には満たしにくい。
6-1. ユーザー確認を踏まえた補足結論
ユーザー確認により、優先順位は次のように見える。
したがって、構造上もっとも重要なのは
作付け変更後も散布済みデータが崩れないことであり、
group_name自体は二次的な論点。ただし帳票や一覧で「当時のグループ」を見たい要求が出るなら、別途スナップショットが必要になる。
7. 次の調査・設計タスク案
year + field + fertilizerから計画単位へ寄せる案を比較するgroup_nameを履歴化する必要があるかを判断する改善案/issue_3_計画始動後の作付け変更_調査.md#L442 (line 442)
旧 plan の当該エントリに対応する RESERVE を削除 という書き方は、現行実装とずれています。RESERVE はエントリ単位ではなく fertilization_plan 単位で全置換管理です。backend/apps/materials/stock_service.py (line 10) の通り、実装上は「旧 plan 全体の RESERVE を再生成」「新 plan 全体の RESERVE を再生成」と書かないと誤実装されやすいです。
改善案/issue_3_計画始動後の作付け変更_調査.md#L437 (line 437)
未散布判定を actual_bags is NULL にしているのは危険です。actual_bags は散布実績再集計の結果で、将来のロジック変更や部分散布時に 0 や端数が入る可能性がありますし、「未散布」と「部分散布」を同一扱いできません。backend/apps/fertilizer/models.py (line 72) を踏まえると、少なくとも「actual_bags is null または 0」「一部散布済みは移動不可 or 分割対象」と明文化した方が安全です。
改善案/issue_3_計画始動後の作付け変更_調査.md#L367 (line 367) と 改善案/issue_3_計画始動後の作付け変更_調査.md#L449 (line 449)
田植え計画を「施肥と同様」とまとめていますが、田植え計画には actual_bags に相当する実績概念がまだありません。backend/apps/plans/serializers.py (line 177) 現状では「全 Entry 移動」なのか「将来の実績連携を見越して未実施分のみ移動」なのかを切り分けて書く必要があります。今の書き方だと、施肥と同じ判定軸があるように読めます。
改善案/issue_3_計画始動後の作付け変更_調査.md#L461 (line 461)
actual_bags 集計ロジックは「影響なし」と言い切らない方がいいです。今回の方針なら大きな改修は不要ですが、前提は「同一年・同圃場・同肥料の行が複数計画にまたがって共存しないこと」です。これは仕様上の制約なので、「影響なし」ではなく「現方針では再利用可能。ただし重複行を作らないことが前提」と書くのが正確です。
改善案/issue_3_計画始動後の作付け変更_調査.md#L428 (line 428)
田植え計画 | 施肥と同様に対応 という決定表現が、下の詳細仕様と少しズレています。詳細では #L463 (line 463) 以降で「現時点では全件移動」と明記されているので、表も「現時点では全件移動、将来実績連携後に再設計」くらいに合わせた方が誤読されません。
改善案/issue_3_計画始動後の作付け変更_調査.md#L444 (line 444)
actual_bags = 0 は現行 services.py では null に丸められる は少し断定が強いです。現行の再集計ロジックでは未該当なら NULL になりやすい、という理解は良いのですが、将来だけでなくデータ補正や手動更新でも 0 が入り得ます。仕様書上は「未散布判定は NULL または 0 を未散布扱いとするかどうか」を明示した方が安全です。
調査結果をもとに、実装タスクを issue 分解しました。
仕様メモ:
改善案/issue_3_計画始動後の作付け変更_調査.md2026-04-07 時点で、依頼されていた調査整理を
改善案/issue_3_計画始動後の作付け変更_調査.mdにまとめたためクローズします。この調査で以下を整理済みです。
後続実装は親子 Issue #4-#8 へ切り出されています。