はじめに
収穫記録の入力をしていたのですが、心が折れたので一括で入力できるようにした話です。
今まではこういう流れでした。
ハウスを選ぶ → 収穫量を入力 → 保存。次のハウスを選ぶ → 収穫量を入力 → 保存。またハウスを選ぶ…
現在記録をつけているのは8ハウスなのですが、毎日8回これを繰り返すことになります。これでは入力する気が起きません。
余談ですが
農家で収穫量を記録している人自体が少ないと思います。反収(10aあたりの出荷量)を気にする農家は多いですが、日々の収穫量をわざわざ記録する人はほとんどいないと思います。それだけ面倒だからです。
では何のために収穫記録をつけるかというと、主に以下のような目的があります。
- ①栽培管理として使う(アスパラでいうと、立茎作業(詳細はこちら)に入るかの指標として収穫量を記録する)
- ②試験区として使う(このハウスは肥料の量を変えていて、収穫量に差があるか確認する、など)
- ③試しに別の作物を栽培してみる場合の収量把握(できた量と出荷した量で歩留まりを算出など)
現在は①のために収穫記録をつけていますが、将来的に③も視野に入れているため、今回収穫記録の入力UIを見直すことにしました。
何が問題だったか
既存の入力UIでは複数ハウスをまとめて選択して登録することはできていました。その場合は全ハウスに同じ値(または按分値)が入る仕組みでした。
問題はハウスごとに収穫量を入力したい場合です。例えばNo.4が5.1kg、No.9が4.8kg、No.11が6.2kgというように異なる場合は、1ハウスずつ選んで登録するしかありませんでした。8ハウスあると毎日8回の操作が必要になります。これでは入力する気が起きません。

どんなUIにするか考えた
入力方式として大きく2つ考えました。
- 個別入力:各ハウスに収穫量を個別に入力する
- 合計のみ:合計収穫量を入力して、選択したハウス数で均等按分する
毎日の入力では「合計のみ」の方が速いです。一方、ハウスごとに収穫量が違う日(試験区など)は「個別入力」が必要になります。両方対応できるようにしました。
また記録単位(畝・ハウス・グループ)によって動作を変える必要があります。整理するとこうなります。
- 畝単位 × 個別入力:各畝に収穫量を入力
- 畝単位 × 合計のみ:畝を選択して合計入力→選択畝数で按分
- ハウス単位 × 個別入力:各ハウスに収穫量を入力
- ハウス単位 × 合計のみ:ハウスを選択して合計入力→選択ハウス数で按分
- グループ単位:合計のみ固定。全ハウスまとめて1回で登録
完成した入力UI
個別入力モードでは、全ハウスが3列で並んでそれぞれに収穫量を入力できます。Enterキーで次の入力欄に移動できるので、キーボードだけで素早く入力できます。

合計のみモードに切り替えると、合計収穫量を1つ入力するだけで選択したハウスに均等按分されます。

按分の端数問題
合計入力で按分するとき、割り切れない場合が出てきます。例えば10kgを3ハウスで按分すると3.333…kgになります。
農薬の按分で同じ問題を解決したことがあったので、同じロジックを使いました。0.1刻みで計算して、端数は先頭ハウスから順に0.1kgずつ分配する方式です。
10kg ÷ 3ハウス → 3.4kg + 3.3kg + 3.3kg = 10.0kg
合計が必ず一致するので、記録のズレが発生しません。
屋外・露地ハウスの除外
前回の記事でハウス周りなどの屋外・露地をfield_type = ‘outdoor’で管理するようにしました。収穫記録の按分対象にハウス周りが混ざると意味がないので、activeFieldsの取得時にoutdoorを除外しました。
const activeFields = fields
.filter((f) => f.field_type !== "outdoor")
.filter((f) => crops.some((c) => c.field_id === f.id && c.is_current))
履歴の内訳表示と編集
一括入力できるようになると、履歴の見せ方と編集方法も考え直す必要が出てきました。
例えばNo.10〜No.17を個別入力で登録した場合、履歴には「合計36.2kg」の1行で表示されます。でも「各ハウスが何kgだったか」を確認したいときがあります。
そこで「内訳」ボタンを追加して、クリックすると各ハウスの収穫量が展開表示されるようにしました。展開した状態で各ハウスの値を直接編集して保存することもできます。
ただ、内訳編集は個別入力で登録したレコードにだけ意味があります。合計入力(按分)で登録したレコードは、合計値を変更して再按分する方が自然です。
「どちらの方式で登録したか」を判別するために、cult_harvestsテーブルにinput_modeカラムを追加しました。
ALTER TABLE cult_harvests ADD COLUMN input_mode text DEFAULT 'total';
これで登録時に’individual’または’total’を保存して、履歴の編集ボタンの動作を出し分けています。
- individual(個別入力)→ 内訳ボタンが表示され、各ハウスを個別編集できる
- total(合計入力)→ 従来の編集ダイアログが開き、合計値を変更して再按分できる
まとめ
収穫記録の入力UIを一括入力方式に作り直しました。
- 個別入力と合計のみの2モードを用意
- 按分の端数処理で合計が必ず一致する
- 屋外・露地ハウスを按分対象から除外
- input_modeカラムで個別入力と合計入力を判別して編集UIを出し分け
毎日の収穫記録が1回の操作でまとめて登録できるようになったので手間は減りましたが、履歴の表示がちょっと見にくいとか、各ハウスの集計とかわからないとかあるので、その辺もちょこちょこ運用しながら直していきたいと思います。
