計量(現行仕様)¶
読む順: この 1 本で全体像がつかめます。操作手順は
operations-manual/05-weighing.md、
機械が守る不変条件は AGENTS.md の該当節です。同じことは二度書きません。
最終更新: 2026-08-13(mig108/111/118/131/143/144/199 と現行 Web を反映)
この図が答える問い¶
3種類の分岐¶
この図は、入力の入口を3種類に分け、別種別の完了 RPC を混ぜたときに fail-closed になる境界を示します。
計量3種類の分岐。
各種別の状態遷移¶
この図は、3種類の計量を同じ画面状態として扱わず、それぞれの確定地点を示します。
3種類の計量を同じ画面状態として扱わず、それぞれの確定地点。
1. 計量には 3 種類ある¶
サイドバー「計量」から入り、画面上部のタブ(計量ボード / 計量一覧 / 持ち込み計量)で
切り替えます。データ上は weighings.weighing_kind の 3 値がすべてを分けます。
| single(社内・単発) | run(社内・コース運行) | walk_in(顧客持ち込み) | |
|---|---|---|---|
| 何を量るか | 1 台のトラックの 1 回の搬入 | 1 コース分をまとめて | 客がヤードへ持ち込んだ荷物 |
| 重量の確定 | 入庫(総重量)→ 出庫(空車) | ドライバーの目方 + 帰社時のスケール実測 | その場で逐次計量 |
| 品目の内訳 | 事務が按分(Σ品目 = net を検証) | 確定目方の比率で自動按分 | 1 行ずつ実測 |
| 金額 | 扱わない(単価契約は請求側) | 扱わない | その場で金額まで(買取 / 引取) |
| 画面 | /collector/weighings(計量ボード) |
同ボード + ドライバー PWA | /collector/walk-in-weighing |
single は最初からある基本形で、run と walk_in はそれを壊さずに足した拡張です。 run を導入しても single の完了 RPC・画面の挙動は変わっていません(意図的な不変条件)。
2. 計量ボード(single)¶
立て続けに来る複数トラックを並行管理するための二段階ライフサイクルです。
入庫(総重量)→ 荷下ろし中 → 出庫(空車重量)→ 按分待ち → 品目按分 → 本日の完了
- 進行中の車両はカードで並び、各操作はフルスクリーンのタッチパネル + 大型テンキーで完結します
- net = 総重量 − 空車重量。按分では Σ(品目重量) = net を検証してから確定します
入庫パネルは車両起点で、必須の自工場車両と回収先を選びます。当日の配車由来の回収先が quick-pick に並び、見つからなければ回収先名・取引先名・住所で検索できます。
3. コース運行の計量(run)— 目方と帰社計量¶
社内コース(資源 7 品目)は回収先ごとに計量できないため、ドライバーの目方(見積り)と 帰社時のスケール実測を組み合わせます。
- ドライバーが目方を入れる(PWA「本日」→ 目方入力)。回収先 × 品目ごとに kg または 袋数 × テナント別の kg 換算(品目単位設定)で入力する。目方は原本として保存され、 後から按分で上書きされない
- 帰社してスケールに乗ると、事務が計量ボードでその運行の実測 net を確定する。 帰社計量は 1 運行に何回でもできる(午前と午後で 2 回帰るコースがある)。各回は 「回収完了かつ未計量」の回収先を自動で引き受けて按分する
- 確定保存では、実測 net を確定目方の比率で回収先 × 品目へ配分する。 Σ(確定重量) = net が厳密に成立する(端数は最大剰余法で吸収)
按分の対象になるのは「意味のある目方が入った回収先」だけです。 配車予定があっても目方が 無ければ対象外、最終処分場(処分費を払って捨てる側)は生成時と確定時の両方で除外されます。 ボード上の運行タイトルも同じ集合から作るので、表示と確定対象が食い違いません。
ドライバーに見えるのは自分の運行だけで、現場メモ(notes・単価メモが書かれることが
あるため)は取得列から除外しています。確定重量(weight_kg)はドライバーからは書けません
(按分だけが書く)。
4. 持ち込み計量(walk_in)¶
一般客・持ち込み業者がヤードに直接持ち込む取引です。計量から金額確定・計量証明書の発行まで この画面で完結します。
- 計量方法は 3 つ: 逐次差分(乗せたまま品目を降ろして差分を取る)/ 単発 / 個別
- 確定すると受付番号(
YYYYMMDD-連番・テナント × 日で直列採番)が付く - 重量だけ先に確定して、単価は後から付けられる(重量先行発行 + 後付価格)
- 金額の符号は正 = お客様がお支払い / 負 = お客様へお支払い(買取超過はマイナス)
- 計量証明書 PDF(A4・pdf-lib + 日本語フォント埋め込み)を発行・再発行できる。 再発行しても受付番号は変わらない
確定は必ず専用 RPC 経由です(画面から weighings を直接 INSERT する経路はありません)。
「入力が不正なら確定ボタンが押せない」ようにプレビューで先回りし、サーバー側の検証と
二重になっています。
5. スケール連携 — 手入力しない¶
計量ボードと持ち込み計量は、重量をスケールから直接取れます。ソースは 2 系統です。
| 方式 | 実体 | 使いどころ |
|---|---|---|
| シリアル直結 | Web Serial API で A&D 指示計(AD-4410 = 2400bps / AD-4347 = 9600bps)を読む | スケール PC のブラウザ |
| 計量ファイル監視 | 計量ソフトが書き出すファイルを File System Access API で監視 | 環境将軍と併用する現場 |
シリアルは「自動」を選ぶと通信条件を確度順に試して当たった設定を記憶します。 安定検出(値が揺れている間は確定しない)を通ってから転記されます。
6. 持ち込みの精算区分・未収(mig199)¶
持ち込み計量の settled_at は入金状態を表します。確定時に精算区分が 月次精算 (monthly) と明示された
場合だけ未収として NULL になり、その場精算 (spot) または精算区分未指定は確定時の now() で入金済みになります。
確定後に精算区分を変更することはできません。
- 月次精算で
settled_at is nullの行は「未収」です。一覧の「未収のみ」フィルタはsettlement_mode='monthly' and settled_at is nullだけを対象にします。 - 実際の入金を確認したら、staff(admin / normal)だけが「入金を記録」を実行できます。対象は月次精算の行に限られ、
settled_atに記録時刻を保存します。 - 誤記録は同じく staff が「入金記録を取消」で戻せます。これも月次精算の行に限られます。driver には入金操作を表示しません。
7. データの出口¶
| 出口 | 場所 | 何ができるか |
|---|---|---|
| 計量一覧 | 計量タブ「計量一覧」 | 種別・取引先で絞り込み、証明書番号・入金状態・未収フィルタ、入金記録、再発行、品目内訳つき CSV 出力 |
| 取引先別の重量 | 取引先詳細「重量データ」 | 取引先計 + 回収先別 × 品目の月次重量 |
- 月次集計は item 側の回収先 / 取引先を優先して集計します(run は親の取引先が空のため。
single は親の値へフォールバック)。確定済み(
weight_kg > 0)だけが集計対象で、 目方のままの行は入りません - 取引先 × 品目の重量データは取引先詳細の「重量データ」から確認します。
8. 気をつける点(実際に起きた不具合)¶
いずれも修正済みですが、同じ形を再導入しないための記録です。
run の目方保存を .upsert() に戻してはいけません。 目方の一意索引は部分索引になったため、
PostgREST は ON CONFLICT の対象を推論できず全ロールで 400 になります。この失敗は
raw SQL でもテストのモックでも再現せず、実経路でだけ出ます。保存は RPC 経由を維持します。
「配車予定 = 按分対象」にしてはいけません。 目方ゲート導入前は、配車だけあって目方の無い 回収先が確定画面に並び、0 kg の行が量産されていました。対象は「目方が入った回収先」です。
計量一覧の親取引先だけを見ると run が消えます。 run は親 weighings.partner_id が
NULL のため、取引先フィルタは item 側の取引先で判定しています。
9. 詳細はどこを見るか¶
| 知りたいこと | 参照先 |
|---|---|
| 機械が守る不変条件 | AGENTS.md の「Resource Weighing Run Optimization」「Internal-Course Multi-Weighing」「Walk-in Weighing」「社内コース帰社計量 確定保存」「Scale Serial Auto-Probe」 |
| 操作手順 | operations-manual/05-weighing.md |
| ドライバーの目方入力 | operations-manual/08-driver-pwa.md |
| 品目単位設定(袋数 → kg 換算) | masters.md |
| 認可の境界(driver に何が見えるか) | auth-permissions.md |
| 設計時の検討経緯 | superpowers/specs/(書き捨て・現行ではない) |
10. 現行の確定契約(mig222 / 223 / 224)¶
目方の確定は原本凍結ではなく、driver が現時点の入力を完了したという run 単位の宣言です。入力画面・保存の allowedSiteIds・帰社計量の警告は同じ純関数から導出し、確定後に完了した stop は再表示して再警告します。
品目別の按分丸めは提案値だけに適用します。例えば品目設定の 10kg 丸めは帰社計量で事務へ提示する按分候補を 10kg 単位へ寄せるだけで、確定目方やサーバーの総和を丸めません。確定保存では総重量・風袋・確定目方の合計を厳密に検証します。
計量一覧は 1 ページ 50 件です。ページをまたぐ総件数を保持し、ソートは全結果へ適用し、CSV は現在の条件に一致する全件を出力します。取得失敗は空の一覧や 0 件に変換しません。
持ち込みの後付け価格は、計量日が属する価格適用期間を解決して単価を選びます。期間外の単価を推測せず、価格未確定の状態を保ちます。
袋数入力は数量・単位名・kg換算係数を保存時のスナップショットとして保持します(mig261)。目方入力中は再取得を止め、入力済み一覧側だけを更新します。操作は手順書05/08を参照してください。