← 概要へ戻る

出荷検品・スキャン先行照合アプリ

出荷検品・スキャン先行照合アプリ

背景・課題

出荷検品は、基幹システムで箱ごとの梱包明細(P/L)が確定してからでないと照合を始められない運用でした。そのため、実物の確認と照合作業が直列になり、担当者は明細待ちの時間が発生し、途中で中断した作業の状況も個人の記憶やメモに頼りがちでした。 もう一つの課題は「何が起きたかを後から追えない」ことです。異なる製品が混入した場合、どの時点でスキャンされたのかを辿る手段がなく、原因調査に時間がかかっていました。 そこで、まず実物をバーコードでスキャンして記録し、P/Lが確定した段階で初めて突き合わせる『スキャン先行・P/L後照合』方式に業務フロー自体を組み替えることにしました。

背景・課題

主要機能・特徴

【スキャン】 型番・ロット識別・数量(Qty)の3種類を、どの順番で読んでもバッファに貯め、3点そろった時点で1明細として確定します。形式は正規表現で自動判定するため、作業者は種別を意識する必要がありません。誤読は赤フラッシュとエラー音で即座に伝わり、UNDOバーコードで直前の1件を取り消せます。 【状態管理】 各伝票は『スキャン中 → 照合待ち → 照合済み』の3状態で管理し、ホーム画面のカンバンで担当者ごとに進捗が見えます。カードを担当者へドラッグするだけで作業を引き継げます。 【照合】 照合画面ではP/Lとスキャン結果を左右に並べたdiff表示にし、一致・数量不足・数量超過・P/Lに存在しない製品の混入を色とアイコンで区別します。差分が残っている間は確定ボタンを無効化し、確定は必ず差分ゼロの状態でしか行えません。

主要機能・特徴

差分を『読ませる』照合画面

照合結果はgit diffのような左右対比のテーブルで表示します。左がP/L、右がスキャン結果、中央に状態アイコンを置き、混入品には専用バッジを付けます。混入行をクリックするとスキャンの時系列が展開され、いつ紛れ込んだかを追跡できます。編集モードでは誤スキャン行をその場で削除でき、削除のたびに差分を再計算して画面を更新します。修正の履歴はeditLogとして保存され、後から『誰が何を消したか』を確認できます。

差分を『読ませる』照合画面

技術選定・アーキテクチャ

配布先は倉庫の既存Windows PCで、専用サーバーを増やせない環境でした。そこでTauri v2(Rust + WebView2)を採用し、インストーラー1本で配れる軽量なデスクトップアプリとしました。Electronに比べて配布物が小さく、既存PCへの負荷も抑えられます。 フロントエンドはフレームワークやバンドラーを使わないHTML/CSS/Vanilla JSです。画面数が少なく、状態は『伝票ごとのセッション』に集約できるため、ビルド工程を持たないことによる保守のしやすさを優先しました。 DBへの参照だけはRust側に集約しています。ODBC(odbc-api)でP/L用ビューを読み取り、フロントからはinvokeで呼ぶだけの構成です。ネイティブのODBCドライバを直接使えるため、既存のDSN設定をそのまま流用でき、ブラウザ単体では不可能な社内DBへの接続と、履歴ファイルのローカル保存を両立できました。スキャン中はDBを一切参照しないので、DBの応答遅延や停止がスキャン作業を止めることもありません。

技術的工夫

【スキャナー入力の判別】 バーコードリーダーはキーボードとして1文字ずつ高速に入力し、最後にEnterを送ります。captureフェーズのkeydownリスナーを1つだけ登録し、55msを超える無入力でバッファを破棄することで、手入力とスキャナー入力を区別しています。モーダル表示中は入力を無視し、画面遷移のたびにリスナーとタイマーを確実に解除して、リークや誤発火を防いでいます。 【DB接続の安全性と、方針転換の経緯】 接続文字列に含まれるDSN・ユーザー・パスワードは、特殊文字を含む値だけを{}で囲む関数で組み立てます。当初はすべての値を常に{}で囲む実装にしていましたが、一部のドライバーマネージャでDSN名が『未登録』と誤判定される不具合が現場PCで判明したため、『特殊文字を含む場合のみ囲む』方針に変更しました。検索キーは長さと文字種を検証したうえでパラメータ化クエリに渡し、SQLインジェクションを防いでいます。 【認証情報の分離】 DB認証情報はソースから分離し、gitignore済みの設定ファイルまたは設定画面の保存値から読み込みます。設定ファイルが無いPCでもアプリが起動するよう読み込み失敗を許容し、設定画面の値を優先する構成にしました。 【運用しながらの改善】 コードレビューで見つかったテンプレート文字列の崩れや、履歴ファイルからの照合表示など、細かな不具合は継続的に修正しています。現在も例外的な入力パターンへの対応を進めており、運用の中で堅牢性を高めている段階です。

技術的工夫

タイ語・日本語とダークモード

利用者はタイ語話者の現場作業者と日本語話者の管理者が混在するため、UIはタイ語・日本語の2言語に対応しています。辞書はキー単位で管理し、動的に生成するトースト、確認ダイアログ、差分ラベル、エラーメッセージにも同じ仕組みを使うことで、言語が混在する表示を排除しました(ドキュメントも同様に2言語で整備)。倉庫の照明環境でフラッシュが見やすいよう、ダークテーマも用意しています。

タイ語・日本語とダークモード

成果・インパクト

スキャンと照合を分離したことで、基幹システムの明細確定を待たずに検品作業を進められるようになりました。差分がゼロになるまで確定できない仕組みにより、確認漏れや混入品の見落としを運用ルールではなくシステム側で抑止しています。 照合済みの伝票は、伝票番号ごとのJSON履歴ファイルとして保存し、CSV(BOM付きUTF-8でExcelでも文字化けしない)でも出力できます。履歴は3年間保持され、担当者の引き継ぎや後日の問い合わせにも対応できます。 ※ 処理時間の短縮率など定量的な効果は、現時点では計測していないため掲載していません。導入後の実測は今後の課題です。

成果・インパクト
← 概要へ戻る