diff --git a/document/18_マスタードキュメント_農薬散布管理編.md b/document/18_マスタードキュメント_農薬散布管理編.md index c6cc8f6..9254442 100644 --- a/document/18_マスタードキュメント_農薬散布管理編.md +++ b/document/18_マスタードキュメント_農薬散布管理編.md @@ -121,6 +121,7 @@ | use_timing_note | TextField | blank | 使用時期別制限のテキスト(例: 種もみへの処理は1回以内、…) | - `unique_together = ['pesticide', 'ingredient_name', 'crop_name']` +- 同一成分・同一作物であれば製品が異なっても上限値は同一(農水省登録情報の仕様) ### PesticideProductLimit(製品の使用回数上限:作物別) @@ -251,19 +252,20 @@ ### 有効成分総使用回数の集計 -有効成分の総使用回数は「製品」単位でカウントする(農薬取締法の「○○を含む農薬の総使用回数」の定義に従う)。1イベントでMEP剤AとMEP剤Bを同時使用した場合、MEP成分は **2回** カウントされる。 +1回の散布作業(イベント)= 有効成分の使用回数1回。同一成分を含む複数製品を同一イベントで施用することは実務上なく、仮に混合散布しても農薬取締法上「1回の散布 = 1回の使用」と解釈される。 ``` 有効成分総使用回数(年度Y・作物C・成分名I)= - COUNT(SprayEventPesticide) - where SprayEventPesticide.pesticide の PesticideIngredient に + COUNT(DISTINCT SprayEvent.id) + where SprayEvent に SprayEventPesticide が紐づく + かつ SprayEventPesticide.pesticide の PesticideIngredient に name=I かつ is_active=True のものが存在する かつ SprayEventPesticide.pesticide.is_non_target=False - かつ SprayEventPesticide.event に SprayEventResolvedField(crop_name_snapshot=C) が紐づく - かつ SprayEventPesticide.event.year = Y + かつ SprayEvent に SprayEventResolvedField(crop_name_snapshot=C) が紐づく + かつ SprayEvent.year = Y ``` -※ `unique_together=['event', 'pesticide']` により、同一イベント内で同一農薬は重複しないため単純な COUNT で正確に合算できる +※ `SprayEventResolvedField` は圃場ごとに複数行あるため、結合で行が増えても `DISTINCT SprayEvent.id` で 1散布作業を1回だけ数える ### 特別栽培・使用成分数の集計 @@ -606,12 +608,13 @@ Django management command として実装。APIエンドポイントから呼び 2. **使用回数上限は作物別に保持**: 同一農薬でも作物ごとに上限が異なるため `PesticideProductLimit` と `PesticideIngredientLimit` を作物別に複数行保持する。 3. **作物名の照合は別名テーブルで吸収**: 農水省表記の「稲」と内部の「水稲」のような差異を吸収するため、`PesticideCropAlias` を必須とする。 4. **散布対象は保存時に確定保存する**: 後日のグループ名変更や作付け変更で過去実績の集計結果が変わらないよう、`SprayEventResolvedField` に圃場・作物をスナップショット保存する。`SprayEvent` 自体には作物情報を持たない。 -5. **有効成分総使用回数は `SprayEventPesticide` 単位で集計する**: 1イベントでMEP剤AとMEP剤Bを同時使用した場合、MEP成分は2回とカウントする。`unique_together=['event', 'pesticide']` で重複行を防ぎ、単純な COUNT で正確に計算できる。 +5. **有効成分総使用回数も「1イベント=1回」**: 同一成分を含む複数製品を同一イベントで施用することは実務上なく、仮に混合散布しても農薬取締法上「1回の散布=1回の使用」。製品使用回数と同様に `COUNT(DISTINCT SprayEvent.id)` で集計する。`SprayEventResolvedField` との結合で行が増えても `DISTINCT` で正確にカウントできる。 6. **総使用回数はテキストパース**: 農水省サイトの「○○を含む農薬の総使用回数」カラムから正規表現で数値を抽出する。 -7. **保存はブロックしない**: 使用回数超過は警告表示のみ。農薬散布の記録は法的義務があるため、超過でも保存できるようにする。 -8. **`SprayEventPesticide.pesticide` は PROTECT**: 散布記録に使用中の農薬は削除不可。 -9. **成分集計は `is_active=True` のみ対象**: 「その他成分」は総使用回数・特別栽培の成分数集計に含めない。 -10. **`is_spreader=True` は `is_non_target` 扱い**: 展着剤はカウント除外のため、展着剤フラグをセットすれば節減対象外フラグも自動的に True 扱い(DB保存は別フィールド)。 +7. **有効成分上限は最小値で判定する**: 同一作物・同一成分で複数製品を併用した場合、`ingredient_usage.max_total_uses` には使用製品群に紐づく `PesticideIngredientLimit.max_total_uses` の最小値を採用する。 +8. **保存はブロックしない**: 使用回数超過は警告表示のみ。農薬散布の記録は法的義務があるため、超過でも保存できるようにする。 +9. **`SprayEventPesticide.pesticide` は PROTECT**: 散布記録に使用中の農薬は削除不可。 +10. **成分集計は `is_active=True` のみ対象**: 「その他成分」は総使用回数・特別栽培の成分数集計に含めない。 +11. **`is_spreader=True` は `is_non_target` 扱い**: 展着剤はカウント除外のため、展着剤フラグをセットすれば節減対象外フラグも自動的に True 扱い(DB保存は別フィールド)。 ---