From 3e2942b479266109733274f23e4a13c2085d0c93 Mon Sep 17 00:00:00 2001 From: akira Date: Thu, 9 Apr 2026 15:11:15 +0900 Subject: [PATCH] =?UTF-8?q?=E5=A4=89=E6=9B=B4=E5=86=85=E5=AE=B9=20?= =?UTF-8?q?=E9=9B=86=E8=A8=88=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=81=AE?= =?UTF-8?q?=E6=98=8E=E7=A2=BA=E5=8C=96=EF=BC=88=E8=BE=B2=E8=96=AC=E5=8F=96?= =?UTF-8?q?=E7=B7=A0=E6=B3=95=E3=81=AE=E8=A6=81=E4=BB=B6=E3=82=92=E6=98=8E?= =?UTF-8?q?=E7=A4=BA=EF=BC=89:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 集計単位の説明に「農薬取締法上、使用回数は作物単位で管理する義務がある」を明記 グループ内に複数作物が混在する場合の動作を明示 → 同一イベントの農薬が水稲・大豆それぞれの回数に +1 カウントされる 集計の正源は SprayEventResolvedField.crop_name_snapshot(圃場ごと)に統一 不要フィールドの削除: SprayEvent.crop_snapshot / variety_snapshot を削除(役割が SprayEventResolvedField に統合されたため) APIレスポンス例からも除去 集計式の精緻化: 「1イベント = 1回」のカウント原則を明示(COUNT(DISTINCT SprayEvent.id))— グループ内に圃場が何筆あっても1散布作業は1回 --- .../18_マスタードキュメント_農薬散布管理編.md | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/document/18_マスタードキュメント_農薬散布管理編.md b/document/18_マスタードキュメント_農薬散布管理編.md index bf5c2d1..7097d92 100644 --- a/document/18_マスタードキュメント_農薬散布管理編.md +++ b/document/18_マスタードキュメント_農薬散布管理編.md @@ -170,8 +170,6 @@ | target_group | CharField(50) | blank | 対象が圃場グループの場合(group_name) | | target_crop | FK(plans.Crop) | null=True, PROTECT | 対象が作物の場合 | | target_variety | FK(plans.Variety) | null=True, PROTECT | 対象が品種の場合 | -| crop_snapshot | CharField(100) | blank | 保存時点の集計対象作物名 | -| variety_snapshot | CharField(100) | blank | 保存時点の対象品種名 | | notes | TextField | blank | 備考 | | created_at | DateTimeField | auto | | | updated_at | DateTimeField | auto | | @@ -185,7 +183,7 @@ | `crop` | target_crop | 特定の作物に対して散布(作付け計画と照合) | | `variety` | target_variety | 特定の品種に対して散布(作付け計画と照合) | -- 保存時に `crop_snapshot` / `variety_snapshot` を自動設定し、後日の作付け変更やグループ名変更があっても過去実績の集計結果が変わらないようにする +- 保存時に全対象圃場を `SprayEventResolvedField` として確定保存し、後日の作付け変更やグループ名変更があっても過去実績の集計結果が変わらないようにする ### SprayEventResolvedField(散布イベント対象圃場スナップショット) @@ -229,37 +227,46 @@ ### 集計単位 -**年度 × 作物** を基本単位とする。 +**年度 × 作物** を基本単位とする(農薬取締法上、使用回数は作物単位で管理する義務がある)。 -- 集計対象作物は `SprayEvent.crop_snapshot` と `SprayEventResolvedField.crop_name_snapshot` を正とする -- `target_type=field`/`group`/`crop`/`variety` の違いにかかわらず、保存時に解決済み対象圃場と作物スナップショットを作成する -- 使用回数上限の照合は、内部 `Crop` から `PesticideCropAlias` を介して農水省表記へ変換して行う +- 集計対象作物は `SprayEventResolvedField.crop_name_snapshot` を正とする(圃場ごとに記録) +- `target_type=field`/`group`/`crop`/`variety` の違いにかかわらず、保存時に全対象圃場の `SprayEventResolvedField` を作成し、各圃場の作物をスナップショットとして保持する +- **グループ内に複数作物が混在する場合**、同一の散布イベント・散布農薬でも作物ごとに使用回数がカウントされる。例:グループ内に「水稲」3筆・「大豆」1筆が含まれる場合、そのイベントの農薬は水稲の回数にも大豆の回数にも +1 される +- 使用回数上限の照合は、`SprayEventResolvedField.crop_name_snapshot` → `PesticideCropAlias` → `PesticideProductLimit` / `PesticideIngredientLimit` の順に行う ### 製品使用回数の集計 ``` -製品使用回数 = COUNT(SprayEventPesticide where pesticide=X) - で year × 作物 でフィルタしたもの +製品使用回数(年度Y・作物C・農薬P)= + COUNT(DISTINCT SprayEvent.id) + where SprayEvent に SprayEventPesticide(pesticide=P) が紐づく + かつ SprayEvent に SprayEventResolvedField(crop_name_snapshot=C) が紐づく + かつ SprayEvent.year = Y ``` +※ 1イベントで複数圃場に散布しても、そのイベントは「1回」とカウントする(1イベント=1散布作業) + ### 有効成分総使用回数の集計 ``` -有効成分総使用回数 = COUNT(SprayEventPesticide) - where SprayEventPesticide.pesticide に - 当該有効成分(PesticideIngredient.name)が含まれる - かつ PesticideIngredient.is_active=True - かつ is_non_target=False - で year × 作物 でフィルタしたもの +有効成分総使用回数(年度Y・作物C・成分名I)= + COUNT(DISTINCT SprayEvent.id) + where SprayEvent に SprayEventPesticide が紐づく + かつ SprayEventPesticide.pesticide の PesticideIngredient に + name=I かつ is_active=True のものが存在する + かつ SprayEventPesticide.pesticide.is_non_target=False + かつ SprayEvent に SprayEventResolvedField(crop_name_snapshot=C) が紐づく + かつ SprayEvent.year = Y ``` ### 特別栽培・使用成分数の集計 ``` -使用成分数 = COUNT(DISTINCT PesticideIngredient.name) - where 当該年度×作物の散布イベントで使用された農薬の有効成分 - かつ PesticideIngredient.is_active=True - かつ pesticide.is_non_target=False +使用成分数(年度Y・作物C)= + COUNT(DISTINCT PesticideIngredient.name) + where 上記条件(年度Y・作物C)の散布イベントで使用された農薬に含まれる + かつ PesticideIngredient.is_active=True + かつ SprayEventPesticide.pesticide.is_non_target=False ``` --- @@ -418,8 +425,6 @@ "target_type": "group", "target_group": "田中エリア", "target_display": "田中エリア(グループ)", - "crop_snapshot": "水稲", - "variety_snapshot": "", "resolved_fields": [ { "field": 5,