栽培管理アプリを作ってます⑥:複数ハウス選択と農薬混用に対応した話

目次

はじめに

前回は、農薬マスタのCSVインポートから実際の防除作業記録まで、データの流れを一通り実装しました。

CSVインポートに関しては、本来は初めから全ての農薬を登録しておくべきだとは思いますが、
全作物になると農薬マスタは膨大になるので、各作物で対応するこの方法が良いのではと思っています。

今回は、さらに実用性を高めるため、複数ハウスをまたいだ畝選択農薬の混用対応という2つの大きな機能を実装しました。

この記事では、実装した機能の詳細と、開発中に直面した課題、そしてその解決策について解説します。

実装した機能

1. 複数ハウスをまたいだ畝選択

問題点

これまでは、1つのハウスの畝しか選択できませんでした。例えば、10ハウスに500Lの農薬を散布する場合、10回に分けて作業記録を登録する必要がありました。

実際の農作業では、複数のハウスをまたいで一度に散布することが一般的なので、これは大きな手間でした。

解決策

複数ハウスの畝を同時に選択できるように改修しました。これにより、10ハウスへの散布作業が1回の登録で完了するようになりました。

畝が緑色に塗られているものが選択したもの。複数選択して同時に登録できるように

実装のポイント:面積比での使用量自動配分

複数ハウスを選択した場合、各ハウスへの使用量をどう配分するかが問題になります。今回は面積比での自動配分を実装しました。

例:

  • No.1ハウス:300m²
  • No.2ハウス:250m²
  • No.3ハウス:100m²(畝2つ分)
  • 合計散布量:500L

配分結果:

  • No.1:231L(500L × 300/650)
  • No.2:192L(500L × 250/650)
  • No.3:77L(500L × 100/650)

このように、各ハウスの面積に応じて自動的に使用量が配分されるため、計算の手間がなくなり、記録ミスも防げます。

また、すべての数値は小数第1位で統一し、データベースに保存される時点で丸めることで、表示のブレや計算誤差の蓄積を防いでいます。

2. 農薬の混用対応(最大4種類)

問題点

これまでは1回の作業に1つの農薬しか登録できませんでした。しかし、実際の農作業では殺菌剤+殺虫剤など、複数の農薬を混用することが一般的です。

解決策

1回の作業で最大4種類の農薬を登録できるようにしました。各農薬ごとに以下の情報を入力できます:

  • 農薬名
  • 対象病害虫
  • 希釈倍率
  • 合計原液量

実装のポイント:希釈倍率 ⇄ 合計原液量の双方向計算

農薬の使用量を記録する際、希釈倍率から原液量を計算することもあれば、原液量から希釈倍率を逆算することもあります。

例えば:

  • 散布量500L、希釈倍率2000倍 → 原液量250ml(自動計算)
  • 散布量500L、原液量245mlに変更 → 希釈倍率2041倍(自動再計算)

このように、どちらを変更しても、もう一方が自動的に計算される仕組みにしました。これにより、現場での柔軟な記録が可能になりました。

データベース設計:cult_log_pesticides テーブル

混用に対応するため、新しくcult_log_pesticidesテーブルを追加しました。これにより、1つの作業記録(cult_logs)に対して、複数の農薬詳細(cult_log_pesticides)を紐付けることができます。

このような1対多の関係にすることで、混用の記録が正確に残せるようになりました。

3. 直近の作業に農薬名を表示

直近の作業のアイコン(詳細は基本機能の実装を参照)をクリックすると、下部の詳細エリアに使用した農薬名が表示されるようにしました。混用の場合は、改行して複数の農薬名が表示されます。

これにより、直近の作業で何を使ったかが一目で分かるようになりました。
(過去の作業履歴一覧について、別で実装する予定です。)

技術的な学び

1. データ構造の設計

農薬混用に対応するため、以下のようなデータ構造にしました:

  • cult_logs:作業の基本情報(日付、散布量、作業時間など)
  • cult_log_pesticides:農薬の詳細情報(農薬名、希釈倍率、原液量など)

このように1対多の関係にすることで、1回の作業に複数の農薬を紐付けることができます。また、将来的に農薬の詳細情報を拡張する際も、cult_log_pesticides テーブルを修正するだけで済みます。

2. 原液量の記録方法:合計と配分の2つを用意

面積比での自動配分を実装する際、原液量の記録方法について悩みました。

問題:

合計250mlを3ハウスに配分すると、各83ml × 3 = 249mlとなり、1mlの誤差が出ます。これは面積比での計算上、避けられません。

解決策:

2つの数値を用意することにしました:

  1. 合計原液量(250ml):農薬在庫管理用(実際に使った量)
  2. 各ハウスの配分(249ml):ログ記録用(参考値)

これにより、在庫管理は正確にできる(合計原液量で管理)一方、各ハウスの記録も残る(GAP対応)という両立が実現できました。

3. 双方向計算の実装

希釈倍率と原液量の双方向計算を実装する際、どちらを最後に編集したかを記録する仕組みを作りました。

例えば:

  • 希釈倍率を変更 → 原液量を再計算
  • 原液量を変更 → 希釈倍率を再計算

このロジックにより、ユーザーがどちらを基準にしても柔軟に対応できるようになりました。

苦労した点

1. 1mlの誤差問題と、その解決策の選択

問題の発覚

合計250mlを3ハウスに配分すると、各83ml × 3 = 249mlとなり、どうしても1mlの誤差が出ます。

試行錯誤

最初は畝ごとに四捨五入していましたが、これでは誤差が蓄積してさらに悪化しました。

次に、ハウスごとに調整するロジックを実装しました。これにより、誤差を1ml以内に収めることができました。

最終的な判断

各ハウスの配分を完全に一致させるのは難しい(面積比の計算上避けられない)ため、2つの数値を用意するという解決策を採用しました:

  1. 合計原液量(250ml):農薬在庫管理用(実際に使った量)
  2. 各ハウスの配分(249ml):ログ記録用(参考値)

メリット

  • 在庫管理は正確にできる(合計原液量で管理)
  • 各ハウスの記録も残る(GAP対応)
  • 無理に一致させようとしてロジックを複雑にしない

デバッグの過程

調整ロジックが動いているか確認するため、console.logを追加しました。しかし、サーバーサイドのログは「保存ボタンを押さないと出ない」ことに気づかず、しばらく悩みました。

ターミナルでログを確認する重要性を学びました。

2. UIの調整

農薬混用のモーダルを実装する際、以下の問題に直面しました:

  • モーダルの幅が足りない → 500pxに拡大
  • 入力ボックスがはみ出る → maxWidth: 120pxで調整
  • 農薬名の表示方法 → 改行して複数表示

特に、「合計原液量」の入力ボックスが右側にはみ出る問題は、maxWidthを設定することで解決しました。

実用性の向上

Before(改善前)

  • 10ハウスに散布 → 10回登録が必要
  • 混用 → 記録できない
  • 原液量 → 自分で計算
  • 在庫管理 → 各ハウスの使用量を足し算する必要がある

After(改善後)

  • 10ハウスに散布 → 1回で登録完了
  • 混用 → 4種類まで記録可能
  • 原液量 → 自動計算(双方向)
  • 在庫管理 → 合計原液量が表示されるので、そのまま在庫から引ける

これにより、記録の手間が大幅に削減され、実際の農作業の流れに沿った使いやすいアプリになりました。

まとめ

今回は、複数ハウス選択農薬混用対応という2つの大きな機能を実装しました。

特に、面積比での自動配分や原液量の記録方法について試行錯誤しましたが、最終的には実用性と正確性を両立する仕組みを作ることができました。

これにより、実際の農作業の流れに沿った、使いやすいアプリに近づいてきました。

次回も引き続き、機能改善を進めていきます。

目次